home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 32
/
Aminet 32 (1999)(Schatztruhe)[!][Aug 1999].iso
/
Aminet
/
docs
/
misc
/
rusdevdocs.lha
/
programming
< prev
Wrap
Text File
|
1999-05-16
|
105KB
|
2,104 lines
Ïðîãðàììèðîâàíèå ïîä AmigaOS äëÿ íà÷èíàþùèõ, âåðñèÿ 2.1 beta
(C) 1999 RDC
0) Ðÿä çàìå÷àíèé
Ïðåæäå âñåãî, ïðåäïîëàãàåòñÿ, ÷òî ñ ïðîãðàììèðîâàíèåì êàê òàêîâûì
Âû â îáùåì óæå çíàêîìû - íàïðèìåð, ðàáîòàëè ðàíåå íà ÁÊ, Ñïåêòðóìå,
PC. Ïðèâåòñòâóåòñÿ çíàíèå Ñè, îïûò ïðîãðàììèðîâàíèÿ íà êàêîì-ëèáî èç
àññåìáëåðîâ, çíàíèå àðõèòåêòóð êîìïüþòåðîâ. Ýòîò òåêñò íå ðàññ÷èòàí
íà òîò ñëó÷àé, åñëè Âû ðåøèëè íà÷àòü ïîëíîñòüþ ñ íóëÿ.  òàêîì ñëó÷àå
ðåêîìåíäóåòñÿ íà÷àòü ñ ÷åãî-ëèáî áîëåå ïðîñòîãî - íàïðèìåð, ñ èçó÷åíèÿ
òîãî æå Ñè.
Êðîìå òîãî, î÷åíü ðåêîìåíäóåòñÿ èìåòü îáùåå ïðåäñòàâëåíèå îá
àðõèòåêòóðå è îñîáåííîñòÿõ Àìèãè â öåëîì. Äëÿ ýòîãî ïî÷èòàéòå êíèãó
Ä.Ìèõàéëîâà «AMIGA #1». Âïðî÷åì, êíèãà ýòà áóäåò ïîëåçíà âñåì - îíà
ÿâëÿåòñÿ âåëèêîëåïíûì ñïðàâî÷íèêîì ïî êîìàíäíîìó ÿçûêó DOS è ARexx.
Çäåñü íå áóäåò ðàññìàòðèâàòüñÿ ïðîãðàììèðîâàíèå ñ èñïîëüçîâàíèåì
áèáëèîòåê ââîäà-âûâîäà ANSI C è îáû÷íîãî äëÿ Ñè ñòàðòàï-êîäà. Ðå÷ü
ïîéä¸ò èñêëþ÷èòåëüíî î ïðîãðàììèðîâàíèè ïîä AmigaOS.
1) Ñðåäñòâà ðàçðàáîòêè
Ïðîãðàììû ïîä Àìèãó, êàê ïðàâèëî, ïèøóòñÿ íà Ñè è/èëè Àññåìáëåðå.
Ðàçóìååòñÿ, ÿçûêîâ ïðîãðàììèðîâàíèÿ äîñòóïíî â äåñÿòêè ðàç áîëüøå, íî
ïîääåðæêà â îñíîâíîì èä¸ò äëÿ C/Asm, è âñÿ äîêóìåíòàöèÿ è ïðèìåðû
îáû÷íî ðàññ÷èòûâàþòñÿ èìåííî íà íèõ.
 íàñòîÿùåå âðåìÿ ñóùåñòâóåò ìíîæåñòâî ðàçëè÷íûõ àññåìáëåðîâ.
Îíè ñóùåñòâóþò êàê â âèäå îòäåëüíûõ òðàíñëÿòîðîâ (íàïðèìåð, PhxAss),
òàê è â âèäå ïðîãðàììíûõ ïàêåòîâ òèïà Devpac - â êîìïëåêòå òåêñòîâûé
ðåäàêòîð-îáîëî÷êà, ñîáñòâåííî òðàíñëÿòîð, è îòëàä÷èê. Ðàçíûå
òðàíñëÿòîðû ðàçëè÷àþòñÿ ñêîðîñòüþ òðàíñëÿöèè è êîððåêòíîñòüþ.
Íàïðèìåð, GenAm (èç êîìïëåêòà Devpac) íå ñëèøêîì áûñòð, à PhxAss ïðè
äîñòàòî÷íîé ñêîðîñòè «íå ïîíèìàåò» íåêîòîðûå ïîëåçíûå ïðè¸ìû. Â
îáùåì, âûáîð òðàíñëÿòîðà - äåëî âêóñà. Ðåäàêòîð ãîäèòñÿ ëþáîé - ê
ïðèìåðó, ÿ èñïîëüçóþ îáû÷íûé CygnusED âìåñòî «ðîäíîãî» ðåäàêòîðà
Devpac.
Íàèáîëåå ïîïóëÿðíûé êîìïèëÿòîð Ñè - SAS/C, îí æå äà¸ò íàèáîëåå
îïòèìàëüíûé êîä ïîä 680x0. Ñóùåñòâóåò òàêæå Hisoft C, óñòóïàþùèé åìó
â êà÷åñòâå êîäà, íî èìåþùèé èñêëþ÷èòåëüíî ïðèÿòíóþ è óäîáíóþ ñðåäó
ðàçðàáîòêè. Êðîìå òîãî, ñóùåñòâóåò ðÿä êîìïèëÿòîðîâ òèïà gcc, vbcc,
egcs - ïîðòèðîâàííûõ èç-ïîä UNIX.
Ðàáîòà ñî âñåì ïåðå÷èñëåííûì áóäåò îïèñàíà îòäåëüíî.
2) Êàêóþ ëèòåðàòóðó æåëàòåëüíî èìåòü
Âî-ïåðâûõ, íóæíà êíèãà ïî ïðîãðàììèðîâàíèþ ñåðèè 680x0 íà
àññåìáëåðå. Ñóùåñòâóþò äîêóìåíòàöèè ïî 68000, 68020 è 68030 íà
ðóññêîì ÿçûêå â ýëåêòðîííîì âèäå. Êíèãè íà àíãëèéñêîì ÿçûêå ïî ëþáûì
èìåþùèìñÿ â àññîðòèìåíòå ïðîöåññîðàì áåñïëàòíî âûñûëàåò ïî ïî÷òå ôèðìà
Motorola, íà å¸ Web-ñàéòå äîñòóïíû pdf-âåðñèè êíèã.
Âî-âòîðûõ, ïîëåçíû ëþáûå êíèãè ïî Ñè.  ýòîì êà÷åñòâå èìååò
ñìûñë îáðàòèòü âíèìàíèå íà êíèãó Àëëåíà Ãîëóáà «C&C++: ïðàâèëà
ïðîãðàììèðîâàíèÿ». Â ýëåêòðîííîì âèäå îíà, ê ñîæàëåíèþ, ïîêà
íåäîñòóïíà. Êíèãà ñîäåðæèò ìíîæåñòâî ïîëåçíûõ ðåêîìåíäàöèé ïî ñòèëþ è
ïðè¸ìàì ïðîãðàììèðîâàíèÿ íà Ñè.
Êðîìå òîãî, ñóùåñòâóåò â ýëåêòðîííîì âèäå êëàññè÷åñêàÿ êíèãà
àâòîðîâ Ñè - Êåðíèãàíà è Ðè÷è, è ðÿä äðóãèõ äîêóìåíòîâ.
Â-òðåòüèõ, íóæíû êíèãè ïî ïðîãðàììèðîâàíèþ AmigaOS. Â ýòîé ñâÿçè
íåîáõîäèìû äâà èçäàíèÿ: ROM Kernel Reference Manual è Guru Book. Îáà
ñóùåñòâóþò â ýëåêòðîííîì âèäå. Åñòü òàêæå ðÿä äðóãèõ êíèã.
Íåîáõîäèìî èìåòü àâòîäîêè - äîêóìåíòàöèþ ïî ðàçëè÷íûì áèáëèîòåêàì
ñèñòåìû, ãäå îïèñàíà êàæäàÿ èõ ôóíêöèÿ.
Íó è â-÷åòâ¸ðòûõ, âåñüìà ïîëåçíà áóäåò âîîáùå âñÿêàÿ ëèòåðàòóðà
ïî ïðîãðàììèðîâàíèþ, íå ïðèâÿçàííàÿ ê êîíêðåòíîé ïëàòôîðìå. Ê
ïðèìåðó, ñòîèò îòìåòèòü «Èñêóññòâî ïðîãðàììèðîâàíèÿ» Äîíàëüäà Êíóòà,
èçäàâàâøååñÿ â 70õ ãîäàõ íà ðóññêîì ÿçûêå, íî è ñ òåõ ïîð íå
ïîòåðÿâøåå ñâîåé àêòóàëüíîñòè.
3) Ñ ÷åãî íà÷àòü
Ñ ìîåé òî÷êè çðåíèÿ, ëó÷øå âñåãî íàéòè êàêóþ-ëèáî «íèøó», íå çàíÿòóþ
äðóãèìè ïðîãðàììàìè, è íà÷àòü ðàáîòàòü â ýòîì íàïðàâëåíèè. Ñëîæíîñòü
ïðîãðàììû çàâèñèò îò òîãî, êàêîé îïûò ó Âàñ óæå åñòü. Åñëè ðàíåå Âû
ðàáîòàëè ñ äðóãèìè ïëàòôîðìàìè íà äîñòàòî÷íî ñåðü¸çíîì óðîâíå, ìîæåòå
ñïîêîéíî áðàòüñÿ çà ïðîåêò ëþáîé ñëîæíîñòè, åñëè ñ÷èòàåòå, ÷òî Âû åãî
«ïîòÿíåòå». Åñëè Àìèãà äëÿ Âàñ - ïåðâûé ïîëèãîí äëÿ ïðîãðàììèðîâàíèÿ,
ëó÷øå íà÷àòü ñ ÷åãî-íèáóäü ïîïðîùå - êàêîé-íèáóäü ìåëêîé óòèëèòêè,
íàïðèìåð. Òóïîå ÷òåíèå âñåé ïîäðÿä ëèòåðàòóðû âðÿä ëè ÷òî-íèáóäü äàñò,
ëó÷øèé ìåòîä íàó÷èòüñÿ ÷åìó-ëèáî - ïîïðîáîâàòü ýòî ñäåëàòü ñàìîñòîÿòåëüíî.
Íå ñòîèò áðàòüñÿ çà îòíîñèòåëüíî ñëîæíûå ïðîåêòû, íå èìåÿ
äîñòàòî÷íîãî îïûòà. Âïîëíå âîçìîæíî, ÷òî âðîäå áû âñ¸ è ïîëó÷èòñÿ, íî Âàì
æå ñàìèì ïîòîì áóäåò îáèäíî, êîãäà Âû óçíàåòå, ÷òî âñ¸ ðàíåå ñäåëàííîå
ìîæíî áûëî ñäåëàòü âî ìíîãî ðàç áûñòðåå è êîìïàêòíåå.
4) Êàê íóæíî ïèñàòü ïðîãðàììû, è êàê èõ ïèñàòü íå ñëåäóåò
Ýòîò âîïðîñ äëÿ Àìèãè î÷åíü âàæåí. Åñëè Âû ðàíåå ðàáîòàëè íà
ðàçëè÷íûõ ìàøèíàõ - ÁÊ, Ñïåêòðóì, Àãàò è ò.ï., ñòîèò çàìåòèòü, ÷òî ìåòîäû
ðàáîòû ïðîãðàììû íå áûëè îñîáî êðèòè÷íû. Êàæäàÿ ïðîãðàììà ðàáîòàëà ñàìà
ïî ñåáå è ìîãëà áûòü ïîëíîâëàñòíûì õîçÿèíîì ìàøèíû. Îïåðàöèîííûå ñèñòåìû
áûëè ôàêòè÷åñêè ïóñòûì çâóêîì.
Íà Àìèãå ÎÑ - âàæíåéøàÿ ÷àñòü ìàøèíû. AmigaOS âûñòóïàåò ïîñðåäíèêîì
ìåæäó ïðîãðàììîé è «æåëåçîì» (è ïîëüçîâàòåëåì). Ïîñêîëüêó AmigaOS ìîæåò
âûïîëíÿòü ïðîãðàììû îäíîâðåìåííî, íèêàêàÿ êîððåêòíî íàïèñàííàÿ ïðîãðàììà
íå èìååò ïðàâà áðàòü êîíòðîëü íàä ìàøèíîé - ýòî ìîæåò ïîìåøàòü ðàáîòå
äðóãèõ ïðîãðàìì. «Æåëåçà» äëÿ ïðîãðàììû êàê áû íå ñóùåñòâóåò, è âñå
îïåðàöèè ïðîãðàììà îáÿçàíà ïðîèçâîäèòü, âûçûâàÿ îïåðàöèîííóþ ñèñòåìó.
AmigaOS ïðåäîñòàâëÿåò âåëèêîëåïíóþ âîçìîæíîñòü ñäåëàòü ïðàêòè÷åñêè âñ¸ ñ
ïîìîùüþ ñâîèõ âûçîâîâ. Çà ñ÷¸ò ýòîãî ìîæíî ïèñàòü ïðîãðàììû, ñîâåðøåííî
íåçàâèñèìûå îò æåëåçà - ÿðêèì ïðèìåðîì ÿâëÿåòñÿ êîìïüþòåð DraCo, êîòîðûé
èìååò ñ Àìèãîé òîëüêî îáùèé ïðîöåññîð, íî çà ñ÷¸ò ïîëíîñòüþ ñîâìåñòèìîé
«îïåðàöèîíêè» âûïîëíÿåò ëþáûå ÊÎÐÐÅÊÒÍÎ ÍÀÏÈÑÀÍÍÛÅ ïðîãðàììû äëÿ Àìèãè.
Ñëåäîâàíèå ïðàâèëàì ðàáîòû ñ ñèñòåìîé òàêæå ãàðàíòèðóåò ðàáîòîñïîñîáíîñòü
ïðîãðàììû íà áóäóùèõ âåðñèÿõ ÎÑ è íîâûõ ìàøèíàõ.
 íåêîòîðûõ ñëó÷àÿõ ðàáîòà ñ æåëåçîì ïîçâîëÿåò ðåçêî óâåëè÷èòü
ïðîèçâîäèòåëüíîñòü ðàáîòû ïðîãðàììû - íàïðèìåð, ïðÿìàÿ çàïèñü â
âèäåîïàìÿòü. Îäíàêî, òàêîé ïîäõîä ìîæåò ðàáîòàòü íå âî âñåõ ñëó÷àÿõ, à
òàêæå íåò íèêàêèõ ãàðàíòèé, ÷òî ýòî áóäåò ðàáîòàòü â áóäóùåì. Â òàêèõ
ñëó÷àÿõ èìååò ñìûñë ñäåëàòü îïöèþ â íàñòðîéêàõ ïðîãðàììû, óñòàíàâëèâàåìóþ
âðó÷íóþ - ðàáîòà íàïðÿìóþ (custom routines) èëè ÷åðåç ÎÑ.  ëþáîì ñëó÷àå
íåñîâìåñòèìîñòè ïîëüçîâàòåëü äîëæåí èìåòü âîçìîæíîñòü çàïóñòèòü ïðîãðàììó
â «êîððåêòíîì» ðåæèìå.
Åù¸ îäèí âàæíûé ìîìåíò. Äåëàéòå ïðîãðàììû óíèâåðñàëüíûìè. Íèêîãäà
íå ñòîèò äåëàòü ïðåäïîëîæåíèé òèïà «âðÿä ëè ó ïîëüçîâàòåëÿ áóäåò âèí÷åñòåð
áîëåå 4 ãèãàáàéò» (ïîäóìàéòå ñàìè: òàêîé ïîäõîä ëåò ïÿòü íàçàä áûë áû
âïîëíå íîðìàëüíûì!) èëè «âðÿä ëè ïîëüçîâàòåëü çàïóñòèò ïàðàëëåëüíî åù¸
îäèí ìóçûêàëüíûé ïëååð». Ïðè ðåàëèçàöèè êàêîãî-ëèáî àëãîðèòìà îáÿçàòåëüíî
«ïðîêðóòèòå» â óìå ëþáûå, äàæå ñàìûå èçîùð¸ííûå, íåðåàëüíûå è íåâåðîÿòíûå
ñèòóàöèè. Ïîìíèòå - äàæå íåçàðÿæ¸ííîå ðóæü¸ ðàç â ãîä ñòðåëÿåò ;)
5) AmigaOS ñ ñàìîãî íà÷àëà
AmigaOS îòëè÷àåò îò áîëüøèíñòâà äðóãèõ îïåðàöèîííûõ ñèñòåì å¸
ìîäóëüíîñòü è ðàçäåëÿåìûå ðåñóðñû. AmigaOS ñîñòîèò èç «êèðïè÷èêîâ»,
êàæäûé èç êîòîðûõ âûïîëíÿåò îïðåäåë¸ííóþ çàäà÷ó, è äëÿ ðåøåíèÿ êîíêðåòíîé
çàäà÷è èñïîëüçóþòñÿ òîëüêî òå ìîäóëè, êîòîðûå ðåàëüíî íóæíû. Åñëè îäèí è
òîò æå ìîäóëü íóæåí äëÿ âûïîëíåíèÿ íåñêîëüêèõ çàäà÷, â ïàìÿòè îí
ñóùåñòâóåò â âèäå îäíîé êîïèè, ñ òàê íàçûâàåìûì ðååíòåðàáåëüíûì
(ðàçäåëÿåìûì) êîäîì.
Ïîëüçîâàòåëüñêàÿ ïðîãðàììà âçàèìîäåéñòâóåò ñ ýòèìè ìîäóëÿìè, è èìååò
âîçìîæíîñòü çàäåéñòâîâàòü òå èëè èíûå ôóíêöèè ñèñòåìû, âûçûâàÿ èõ.
Âíóòðåííåå óñòðîéñòâî AmigaOS ìîæíî ïðåäñòàâèòü â âèäå äåðåâà,
ðàçâåòâë¸ííàÿ ñòðóêòóðà êîòîðîãî ñîîòâåòñòâóåò ðàçëè÷íûì «âíóòðåííîñòÿì»
ñèñòåìû. AmigaOS íèêàê íå ïðèâÿçàíà ê êîíêðåòíûì ôèçè÷åñêèì àäðåñàì â
ïàìÿòè, è åäèíñòâåííûì èñêëþ÷åíèåì èç ýòîãî ïðàâèëà ñëóæèò ÿ÷åéêà ñ
àáñîëþòíûì àäðåñîì 4, íàçûâàåìàÿ SysBase.
6) Áèáëèîòåêè
Ðàçäåëÿåìûå áèáëèîòåêè (shared libraries) - îäèí èç «êèðïè÷èêîâ»
AmigaOS. Áèáëèîòåêè èìåþò íàáîð òî÷åê âõîäà, ñ òî÷êè çðåíèÿ
àññåìáëåðà âûçûâàåìûõ êîìàíäîé jsr ïðîöåññîðà. Ñ òî÷êè çðåíèÿ Ñè -
ýòî îáû÷íûå âíåøíèå ôóíêöèè. Ýòè òî÷êè âõîäà è åñòü API (Application
Program Interface) AmigaOS. Êàæäàÿ áèáëèîòåêà èìååò òàê íàçûâàåìóþ
áàçó - óêàçàòåëü íà ñëóæåáíóþ ñòðóêòóðó äàííûõ áèáëèîòåêè (struct
Library). Ñëóæåáíûå äàííûå õðàíÿòñÿ ïî ïîëîæèòåëüíûì ñìåùåíèÿì îò
áàçû, à òî÷êè âõîäà íàõîäÿòñÿ ïî îòðèöàòåëüíûì ñìåùåíèÿì. Ôèçè÷åñêè
ïî àäðåñàì òî÷åê âõîäà ðàçìåùåíû êîìàíäû jmp, ïåðåõîäÿùèå íà ðåàëüíûå
àäðåñà ýòèõ ôóíêöèé.
Ðàçäåëÿåìûìè ýòè áèáëèîòåêè íàçûâàþòñÿ ïîòîìó, ÷òî âñåãäà èìåþò â
ïàìÿòè âñåãî îäíó êîïèþ ñâîåãî êîäà. Åñëè áèáëèîòåêó èñïîëüçóþò
íåñêîëüêî ïðîãðàìì, îíè âûçûâàþò îäèí è òîò æå êîä. Áèáëèîòåêà âñåãäà
ïðèñóòñòâóåò â ïàìÿòè, åñëè îíà íóæíà õîòÿ áû îäíîé ïðîãðàììå. Äàæå
åñëè â äàííûé ìîìåíò îíà óæå íå íóæíà, îíà áóäåò ïðèñóòñòâîâàòü â
ïàìÿòè äî òåõ ïîð, ïîêà åñòü äîñòàòî÷íî ñâîáîäíîé ïàìÿòè. Êàê òîëüêî
ïàìÿòè íå áóäåò õâàòàòü, íåèñïîëüçóåìûå áèáëèîòåêè àâòîìàòè÷åñêè
âûãðóæàþòñÿ èç ïàìÿòè.
Áèáëèîòåêè áûâàþò äâóõ òèïîâ - íàõîäÿùèåñÿ â ÏÇÓ è äèñêîâûå. Â ÏÇÓ
«çàøèòû» îñíîâíûå ôóíêöèè ñèñòåìû - ðàáîòà ñ ðåñóðñàìè ìàøèíû, äèñêîì è
ãðàôèêîé, à òàê æå íåêîòîðûå ñëóæåáíûå ôóíêöèè. Âñå îñòàëüíûå áèáëèîòåêè
ïðè ïåðâîé ïîòðåáíîñòè â íèõ çàãðóæàþòñÿ ñ äèñêà.
Êàæäàÿ áèáëèîòåêà èìååò íîìåð âåðñèè. Ìåõàíèçì âåðñèé ïîçâîëÿåò
ïîñòåïåííî íàðàùèâàòü âîçìîæíîñòè áèáëèîòåê, ñîõðàíÿÿ ñîâìåñòèìîñòü ñî
ñòàðûìè âåðñèÿìè, è íå äîïóñêàòü ñèòóàöèé äîñòóïà áîëåå íîâûõ ïðîãðàìì
ê ôóíêöèÿì, îòñóòñòâóþùèì ó ñòàðûõ áèáëèîòåê.
Ïåðåä òåì, êàê âûçâàòü áèáëèîòåêó ïåðâûé ðàç, å¸ íåîáõîäèìî
îòêðûòü. Åäèíñòâåííàÿ áèáëèîòåêà, êîòîðàÿ ýòîãî íå òðåáóåò - ýòî
Exec, îíà îòêðûòà âñåãäà è íàõîäèòñÿ â ÏÇÓ. Îòêðûâàåòñÿ áèáëèîòåêà
âûçîâîì ôóíêöèè OpenLibrary(), àðãóìåíòàìè êîòîðîé ñëóæàò óêàçàòåëü íà
èìÿ áèáëèîòåêè è ìèíèìàëüíî íåîáõîäèìûé íîìåð âåðñèè. Åñëè áèáëèîòåêà
äîñòóïíà, è å¸ íîìåð âåðñèè ðàâåí èëè áîëüøå òðåáóåìîãî - ôóíêöèÿ
âåðí¸ò óêàçàòåëü íà áàçó áèáëèîòåêè, èíà÷å áóäåò âîçâðàù¸í íóëü.
Exec âñåãäà îòêðûò, è óêàçàòåëü íà åãî áàçó íàõîäèòñÿ â ÿ÷åéêå
ïàìÿòè ñ àáñîëþòíûì àäðåñîì 4.
Ïîñëå èñïîëüçîâàíèÿ áèáëèîòåêè å¸ íåîáõîäèìî çàêðûòü - ýòî
äåëàåòñÿ âûçîâîì CloseLibrary(). Òî æå ñàìîå îòíîñèòñÿ è ê îêíàì, è ê
ýêðàíàì, è ê ôàéëàì, è ìíîãî ê ÷åìó åù¸. Áèáëèîòåêà èìååò ñ÷¸ò÷èê
îòêðûòèé, è ãàðàíòèðîâàííî õðàíèòñÿ â ïàìÿòè òîëüêî â òîì ñëó÷àå, åñëè
ýòîò ñ÷¸ò÷èê áîëüøå íóëÿ.
7) Ñîãëàøåíèÿ î âûçîâå äëÿ Asm è C
Äëÿ âûçîâà ôóíêöèé áèáëèîòåê ïðèíÿòî ïåðåäàâàòü àðãóìåíòû â
ðåãèñòðàõ ïðîöåññîðà. Óêàçàòåëè îáû÷íî ïåðåäàþòñÿ â ðåãèñòðàõ àäðåñà,
çíà÷åíèÿ îáû÷íî ïåðåäàþòñÿ â ðåãèñòðàõ äàííûõ. Ïðè ýòîì îáû÷íî
èñïîëüçóþòñÿ ðåãèñòðû àäðåñà íà÷èíàÿ ñ A0 è äàííûõ íà÷èíàÿ ñ D0.
Âîçìîæíû è èñêëþ÷åíèÿ èç ýòîãî ïðàâèëà - òàê, íàïðèìåð, â dos.library
ïðàêòè÷åñêè âñ¸ ïåðåäà¸òñÿ â ðåãèñòðàõ äàííûõ, íà÷èíàÿ ñ D1.
×òî è êóäà êîíêðåòíî êëàä¸òñÿ - ñìîòðèòå â àâòîäîêàõ. Ïîä êàæäûì
àðãóìåíòîì òàì ïðèïèñàí ðåãèñòð, â êîòîðûé íóæíî ïîëîæèòü àðãóìåíò.
Ðåçóëüòàò, åñëè îí åñòü, âñåãäà âîçâðàùàåòñÿ â ðåãèñòðå D0 - äàæå
â òîì ñëó÷àå, åñëè ýòî óêàçàòåëü. Åñëè íóæíî âåðíóòü çíà÷åíèÿ
íåñêîëüêèõ ïåðåìåííûõ, îáû÷íî ïåðåäàþò ôóíêöèè ðÿä óêàçàòåëåé íà íèõ.
Áàçó áèáëèîòåêè ïðèíÿòî õðàíèòü â ïåðåìåííîé ñ îïðåäåë¸ííûì
èìåíåì. Äëÿ Ñè ýòî áóäåò èìÿ òèïà DOSBase, IntuitionBase è ò.ï., à
äëÿ Asm ýòî áóäåò _DOSBase, _IntuitionBase - ê èìåíè ëþáîé ïåðåìåííîé
íà Ñè ñ òî÷êè çðåíèÿ àññåìáëåðà ïðèáàâëÿåòñÿ çíàê ïîä÷¸ðêèâàíèÿ â
íà÷àëå. Ïîñëå îòêðûòèÿ óêàçàòåëü íà áàçó áèáëèîòåêè êëàä¸òñÿ â ýòó
ïåðåìåííóþ.
Åñëè âûçîâ ôóíêöèé áèáëèîòåê íà Ñè íè÷åì íå îòëè÷àåòñÿ îò âûçîâà
ëþáûõ ïðî÷èõ ôóíêöèé, òî â ñëó÷àå àññåìáëåðà èìåþòñÿ ñëåäóþùèå
ñîãëàøåíèÿ:
- ïðè âûçîâå ëþáûõ ôóíêöèé, åñëè íå îãîâîðåíî èíîå, â ðåãèñòðå A6
äîëæåí ëåæàòü óêàçàòåëü íà áàçó áèáëèîòåêè. Ýòî ñäåëàíî äëÿ
òîãî, ÷òîáû êîä áèáëèîòåêè ìîã èìåòü äîñòóï ê áàçå.
- âûçîâ ôóíêöèè çàïèñûâàåòñÿ â âèäå jsr _LVOèìÿ_ôóíêöèè(a6).
Ñóùåñòâóþò òàêæå ìàêðîñû òèïà CALLEXEC, CALLGFX, CALLINT etc,
êîòîðûå ñàìè èíèöèàëèçèðóþò A6 è äîáàâëÿþò _LVO ê èìåíè.
 ÿçûêå Ñè ñóùåñòâóþò ôóíêöèè ñ ïåðåìåííûì ÷èñëîì àðãóìåíòîâ.
Ïîñêîëüêó ïðîöåññîðà ñ ïåðåìåííûì ÷èñëîì ðåãèñòðîâ äëÿ ýòîé öåëè íèêòî
ïðèäóìûâàòü íå áóäåò, ïîñòóïàþò ïðîùå - ïåðåäàþò â ðåãèñòðå óêàçàòåëü
íà ìàññèâ ïåðåìåííûõ. Ñ òî÷êè çðåíèÿ ïðîãðàììèñòà íà àñìå ñóùåñòâóåò
ëèøü îäíà ôóíêöèÿ, ïîëó÷àþùàÿ óêàçàòåëü íà ìàññèâ. À ñ òî÷êè çðåíèÿ
ïðîãðàììèñòà íà Ñè åñòü äâå ôóíêöèè - óïîìÿíóòàÿ ðàíåå è òàê
íàçûâàåìûé varargs stub. Ýòî «çàãëóøêà», ïðåäñòàâëÿþùàÿ ñîáîé
ìàëåíüêóþ ôóíêöèþ, ïîëó÷àþùóþ ìàññèâ àðãóìåíòîâ êëàññè÷åñêèì äëÿ Ñè
ñïîñîáîì - íà ñòåêå, è ïåðåäàþùàÿ óêàçàòåëü íà ýòîò ó÷àñòîê ñòåêà
âûçûâàåìîé ôóíêöèè ñèñòåìû.
 ðÿäå ñëó÷àåâ íåîáõîäèìî ïåðåäàòü ôóíêöèè íåêîå ïîäìíîæåñòâî
àðãóìåíòîâ èç íåêîòîðîãî, äîñòàòî÷íî áîëüøîãî ìíîæåñòâà. Íàïðèìåð,
êîãäà ìû îòêðûâàåì ýêðàí, ìîæíî íå çàáîòèòüñÿ î ãëóáèíå öâåòà è
âèäåîðåæèìå, ïåðåäàâàÿ àðãóìåíòû Width, Height è Depth, à ïðîñòî
ñêîïèðîâàòü ðåæèì ýêðàíà Workbench. Äëÿ ýòîãî ðåàëèçîâàí ìåõàíèçì
ÒÝÃΠ(tags). Tag ïðåäñòàâëÿåò ñîáîé ïàðó 32-áèòíûõ ÷èñåë, ïåðâîå èç
êîòîðûõ ÿâëÿåòñÿ òèïîì, à âòîðîå çíà÷åíèåì. Taglist, òî åñòü ñïèñîê
òýãîâ, ïðåäñòàâëÿåò ñîáîé ìàññèâ òàêèõ ïàð, çàêàí÷èâàþùèéñÿ íóëåâûì
òèïîì (TAG_END). Taglist îáû÷íî ïåðåäà¸òñÿ â âèäå íàáîðà ÷èñåë
ôóíêöèÿì ñ ïåðåìåííûì ÷èñëîì àðãóìåíòîâ - ôàêòè÷åñêè ïðè ýòîì áóäåò
ïåðåäàí óêàçàòåëü íà ñôîðìèðîâàííûé çàðàíåå (â ñëó÷àå àññåìáëåðà) èëè
ñôîðìèðîâàííûé «íà ëåòó» íà ñòåêå (â ñëó÷àå Ñè) ìàññèâ.
Ê ïðèìåðó, åñëè ìû õîòèì îòêðûòü ýêðàí òàêîãî æå ðàçðåøåíèÿ è
âèäåîðåæèìà, êàê ó Workbench, íî ãëóáèíîé â 4 öâåòà, ïèøåì:
OpenScreenTags(NULL, // ñòðóêòóðà íå ïåðåäà¸òñÿ
SA_LikeWorkbench, TRUE, // ëîãè÷åñêîå çíà÷åíèå
SA_Depth, 2, // ÷åòûðå öâåòà - äâà áèòïëàíà
TAG_END);
Íà àññåìáëåðå òî æå ñàìîå ïðåäñòàâëÿåòñÿ â ñëåäóþùåì âèäå:
...
sub.l a0,a0
lea tags,a1
move.l _IntuitionBase,a6
jsr _LVOOpenScreenTagList(a6)
...
tags dc.l SA_LikeWorkbench, TRUE,
dc.l SA_Depth, 2,
dc.l TAG_END
Òåêñòîâûå ñòðîêè â AmigaOS ñëåäóþò ñîãëàøåíèÿì Ñè - ÿâëÿÿñü
ïîñëåäîâàòåëüíîñòüþ íåíóëåâûõ áàéòîâ, çàêàí÷èâàþùåéñÿ íóë¸ì.
Íåñêîëüêî ñëîâ î ðåçóëüòàòàõ âûïîëíåíèÿ ôóíêöèé. Êàê ïðàâèëî,
èíäèêàöèåé îøèáêè ÿâëÿåòñÿ íóëü â ðåçóëüòàòå âûïîëíåíèÿ. Ðåçóëüòàò
íóæíî îáÿçàòåëüíî ïðîâåðÿòü «íà âøèâîñòü», åñëè âûïîëíÿòü ïðîãðàììó
áåçîòíîñèòåëüíî ðåçóëüòàòîâ, òî â íåêîòîðûõ ñëó÷àÿõ îíà ìîæåò «óïàñòü»
ïðè ïîïûòêå èñïîëüçîâàíèÿ íåäîñòóïíûõ â äàííûé ìîìåíò èëè íà äàííîé
êîíôèãóðàöèè ðåñóðñîâ!
8) Includes
Includes - ôàéëû òèïà #?.h (äëÿ Ñè) è #?.i (äëÿ àññåìáëåðà)
ñîäåðæàò âñå íåîáõîäèìûå îïðåäåëåíèÿ êîíñòàíò, ñòðóêòóð è ôóíêöèé äëÿ
ðàáîòû ñ AmigaOS. Îáû÷íî ïðèíÿòî õðàíèòü èõ íà «include:». Äëÿ
ïîäêëþ÷åíèÿ ëþáîãî èç íèõ èñïîëüçóåòñÿ äèðåêòèâà include àññåìáëåðà
èëè #include ïðåïðîöåññîðà Ñè.
Àññåìáëåð:
Äëÿ ïîëó÷åíèÿ âñåõ ñìåùåíèé ôóíêöèé áèáëèîòåê ïðåäíàçíà÷åíû ôàéëû
ÈìÿÁèáëèîòåêè_lib.i - èìåííî òàì îïðåäåëåíû âñå _LVO (Library Vector
Offsets). Õðàíÿòñÿ îíè â îòäåëüíûõ äèðåêòîðèÿõ äëÿ áèáëèîòåê (òèïà
include:intuition/) èëè â ñïåöèàëüíîé äèðåêòîðèè include:lvo/.
Ñè:
Çäåñü ÷óòü ñëîæíåå, ïîñêîëüêó ðåàëèçàöèÿ çàâèñèò îò êîìïèëÿòîðà.
Äëÿ SAS/C îïðåäåëåíèÿ ôóíêöèé íàõîäÿòñÿ â include:pragmas/ è
íàçûâàþòñÿ ÈìÿÁèáëèîòåêè_pragmas.h. Äëÿ Hisoft C îíè ëåæàò â
include:pragma/ è íàçûâàþòñÿ ÈìÿÁèáëèîòåêè_lib.h. Êðîìå òîãî, äëÿ
SAS/C òðåáóþòñÿ îïðåäåëåíèÿ ïðîòîòèïîâ ôóíêöèé èç include:clib/.
Åñëè Âàì õî÷åòñÿ, ÷òîáû ïðîãðàììà êîìïèëèðîâàëàñü êàê ïîä SAS/C,
òàê è ïîä Hisoft C, ìîæíî èñïîëüçîâàòü óñëîâíóþ êîìïèëÿöèþ - êàê ýòî
ñäåëàòü, áóäåò ðàññêàçàíî äàëüøå.
Îñòàëüíûå, êðîìå ïåðå÷èñëåííîãî, ñïåöèôè÷íîãî äëÿ ÿçûêà, ôàéëû
ÿâëÿþòñÿ îáùèìè ïî ñìûñëó, ðàçëè÷àÿñü ëèøü èìåíåì #?.h è #?.i.
9) Ðàáîòà ñ ïàìÿòüþ
 îòëè÷èå îò ÁÊ, Ñïåêòðóìà, PC è äðóãèõ îäíîçàäà÷íûõ ìàøèí íà
Àìèãå íå èñïîëüçóþòñÿ àáñîëþòíûå àäðåñà. Ïðîãðàììà ìîæåò îêàçàòüñÿ
ïðè ñòàðòå ñ ëþáîãî àäðåñà â ïðåäåëàõ äîñòóïíûõ ïðîöåññîðó ÷åòûð¸õ
ãèãàáàéò. Åäèíñòâåííûé àáñîëþòíûé àäðåñ - ÿ÷åéêà 4.
Êîãäà äëÿ âûïîëíåíèÿ êàêîé-ëèáî çàäà÷è òðåáóåòñÿ ïàìÿòü, å¸ íóæíî
çàðåçåðâèðîâàòü. Ýòî äåëàåòñÿ âûçîâàìè Exec. Êîãäà ðàáîòà ñ ó÷àñòêîì
ïàìÿòè çàêîí÷åíà, åãî íóæíî îñâîáîäèòü. Ïàìÿòü, â êîòîðîé íàõîäèòñÿ
ñàìà ïðîãðàììà ïðè ñòàðòå, óæå çàðåçåðâèðîâàíà ñèñòåìîé è áóäåò
àâòîìàòè÷åñêè îñâîáîæäåíà ïðè âûõîäå èç ïðîãðàììû.
Ïàìÿòü íà Àìèãå ìîæåò áûòü ðàçíûõ òèïîâ. Ïðè ñòàðòå ñèñòåìû
ïðîèñõîäèò ñîñòàâëåíèå ñïèñêà äîñòóïíûõ ó÷àñòêîâ ïàìÿòè, êàæäûé èç
êîòîðûõ èìååò ñâîé ïðèîðèòåò. Ïðè ðåçåðâèðîâàíèè ïàìÿòè ïðîèñõîäèò
ïðîñìîòð âñåõ ó÷àñòêîâ â ïîðÿäêå óìåíüøåíèÿ ïðèîðèòåòà, è ïàìÿòü
âûäåëÿåòñÿ èç òîãî ó÷àñòêà, â êîòîðîì ïåðâûì áûë íàéäåí òðåáóåìûé
ó÷àñòîê çàäàííîãî ðàçìåðà. Chip è Fast ïàìÿòü ïðåäñòàâëÿþò ñîáîé
ïðèìåð òàêèõ ó÷àñòêîâ. Ìîæíî ÿâíî óêàçàòü òèï òðåáóåìîé ïàìÿòè.
Äëÿ ðåçåðâèðîâàíèÿ ïàìÿòè ó AmigaOS åñòü íåñêîëüêî ñðåäñòâ.
Âûçîâ Exec'à AllocVec() ðåçåðâèðóåò çàäàííîå êîëè÷åñòâî áàéòîâ ïàìÿòè
çàäàííîãî òèïà. Àðãóìåíòû ýòîé ôóíêöèè - òðåáóåìûé îáú¸ì ïàìÿòè â
áàéòàõ (D0) è òðåáóåìûé òèï ïàìÿòè (D1). Â ðåçóëüòàòå âîçâðàùàåòñÿ
íà÷àëüíûé àäðåñ çàõâà÷åííîé ïàìÿòè, èëè æå íóëü â ñëó÷àå îøèáêè.
Îáÿçàòåëüíî ïðîâåðÿéòå îøèáêó - ïîïûòêà èñïîëüçîâàòü ïàìÿòü ñ íóëÿ
ïðèâåä¸ò ê êðàõó ñèñòåìû! Äëÿ òîãî, ÷òîáû îñâîáîäèòü çàõâà÷åííóþ
ïàìÿòü, èñïîëüçóéòå FreeVec(), åäèíñòâåííûì àðãóìåíòîì êîòîðîé
ÿâëÿåòñÿ óêàçàòåëü íà ó÷àñòîê ïàìÿòè (A1). Exec ñàìîñòîÿòåëüíî
çàïîìèíàåò îáú¸ì çàõâà÷åííîé ïàìÿòè, è îñâîáîæäàåò ðîâíî ñòîëüêî æå.
Àòðèáóòû îïðåäåëÿþò òèï òðåáóåìîé ïàìÿòè è íåêîòîðûå îïöèè. Îíè
ïîäðîáíî îïèñàíû â àâòîäîêàõ (exec.library/AllocMem() - óñòàðåâøàÿ
ôóíêöèÿ çàõâàòà ó÷àñòêà ïàìÿòè, íå çàïîìèíàþùàÿ åãî ðàçìåð). Îòìåòèì
ëèøü äâå èç íèõ: MEMF_CHIP äîëæåí áûòü ÎÁßÇÀÒÅËÜÍÎ óñòàíîâëåí, åñëè ê
çàõâà÷åííîé ïàìÿòè áóäåò èäòè îáðàùåíèå ÷èïñåòà (íàïðèìåð, òàì áóäåò
êàðòèíêà, ïåðåñûëàåìàÿ áëèòòåðîì íà ýêðàí), è MEMF_CLEAR îçíà÷àåò, ÷òî
âñÿ çàðåçåðâèðîâàííàÿ ïàìÿòü áóäåò îáíóëåíà (â ïðîòèâíîì ñëó÷àå òàì
áóäóò ñëó÷àéíûå çíà÷åíèÿ, îñòàâøèåñÿ îò ïðåäûäóùåãî «õîçÿèíà» ýòîé
ïàìÿòè). Íóëü (MEMF_ANY) îçíà÷àåò îòñòóòñòâèå òðåáîâàíèé ê ïàìÿòè.
Åñòü áîëåå ïðîñòîé ñïîñîá ðàáîòû ñ ïàìÿòüþ. Åñëè ïðîãðàììå âñ¸
âðåìÿ å¸ ðàáîòû íóæåí ó÷àñòîê ïàìÿòè çàäàííîãî ðàçìåðà, è äèíàìè÷åñêè
çàõâàòûâàòü è îñâîáîæäàòü ïàìÿòü íå íóæíî, ìîæíî ïðîñòî óêàçàòü
ñëåäóþùåå:
section xxxx,bss
label ds.b ...
Ñåêöèÿ äàííûõ òàêîãî âèäà îçíà÷àåò, ÷òî ïðè ñòàðòå ïðîãðàììû ýòà
ïàìÿòü áóäåò àâòîìàòè÷åñêè çàðåçåðâèðîâàíà ñèñòåìîé, à ïðè çàâåðøåíèè
ïðîãðàììû - àâòîìàòè÷åñêè îñâîáîæäåíà.  èñïîëíÿåìîì ôàéëå îíà íå
áóäåò çàíèìàòü ìåñòà, ðåçåðâèðîâàíèå ìåãàáàéòà âîâñå íå îçíà÷àåò, ÷òî
èñïîëíÿåìûé ôàéë óâåëè÷èòñÿ íà ìåãàáàéò. Åñëè óêàçàòü òèï ñåêöèè êàê
bss_c, ýòî àíàëîãè÷íî AllocVec ñ àòðèáóòîì MEMF_CHIP.
Ðàçìåùàòü äàííûå â ñåêöèè òèïà bss íåëüçÿ, çäåñü ïðèìåíèìû òîëüêî
êîìàíäû ðåçåðâèðîâàíèÿ ïàìÿòè ds.b, ds.w è ds.l.
Íà Ñè äëÿ òîé æå öåëè èñïîëüçóþòñÿ static-ìàññèâû.  ñëó÷àå
SAS/C ñòîèò óêàçàòü êëþ÷åâîå ñëîâî __far, èíà÷å â íåêîòîðûõ ñëó÷àÿõ
èñïîëíÿåìûé êîä ïðîãðàììû ðàçáóõíåò îò íåêîòîðîãî êîëè÷åñòâà íóëåé.
Äëÿ ïîëó÷åíèÿ èíôîðìàöèè îá îáú¸ìå ñâîáîäíîé ïàìÿòè èñïîëüçóåòñÿ
ôóíêöèÿ AvailMem(). Ÿ àðãóìåíò (D1) - àòðèáóòû ïàìÿòè. Òàêèì îáðàçîì
ìîæíî ïîëó÷èòü îáú¸ì ñâîáîäíîé chip-ïàìÿòè (MEMF_CHIP), fast-ïàìÿòè,
ïàìÿòè âîîáùå (MEMF_ANY), íàèáîëüøåãî íåïðåðûâíîãî ñâîáîäíîãî êóñêà
(MEMF_LARGEST). Ïîñêîëüêó ó íàñ ìíîãîçàäà÷íàÿ ÎÑ, ñâåäåíèÿ îá îáú¸ìå
ïàìÿòè ê ìîìåíòó èõ èñïîëüçîâàíèÿ ìîãóò óñòàðåòü :-)
Äëÿ ïîëó÷åíèÿ èíôîðìàöèè î òèïå ïàìÿòè, óêàçàòåëü íà êîòîðóþ
èìååòñÿ, èñïîëüçóåòñÿ ôóíêöèÿ TypeOfMem(). Åé ïåðåäà¸òñÿ óêàçàòåëü
(A1), à ðåçóëüòàòîì ÿâëÿþòñÿ èñêîìûå àòðèáóòû. Åñëè ôóíêöèÿ ïîëó÷èëà
óêàçàòåëü, íå ïîïàäàþùèé â ïðåäåëû äîñòóïíûõ îáëàñòåé ïàìÿòè, îíà
âåðí¸ò íóëü.
10) Ôðàãìåíòàöèÿ ïàìÿòè
Ôðàãìåíòàöèÿ ïàìÿòè íåèçáåæíî âîçíèêàåò, ïîñêîëüêó ðåçåðâèðóåìûå
ó÷àñòêè ïàìÿòè ìîãóò áûòü òîëüêî íåïðåðûâíûìè. Ðàíî èëè ïîçäíî ìîæåò
îáíàðóæèòñÿ òàêàÿ ñèòóàöèÿ, ÷òî âðîäå áû ïàìÿòè è äîñòàòî÷íî, à
íåïðåðûâíûé ó÷àñòîê òðåáóåìîãî ðàçìåðà íàéòè íå óäà¸òñÿ. Ñ ýòèì
ÿâëåíèåì ìîæíî è íóæíî áîðîòüñÿ ñëåäóþùèìè ñðåäñòâàìè:
1. Åñëè òðåáóåòñÿ îïðåäåë¸ííûé îáú¸ì ïàìÿòè äëÿ ðàáîòû
ïðîãðàììû, ëó÷øå âìåñòî îäíîãî áîëüøîãî ó÷àñòêà ïàìÿòè çàõâàòèòü
íåñêîëüêî ìàëåíüêèõ.
2. Ïî âîçìîæíîñòè èçáåãàéòå äèíàìè÷åñêîé ðàáîòû ñ ïàìÿòüþ. Åñëè
îáú¸ì òðåáóåìîé ïàìÿòè íåâåëèê, ëó÷øå ðàáîòàòü ñ bss ñåêöèÿìè.
Äèíàìè÷åñêàÿ ðàáîòà ñ ïàìÿòüþ îïðàâäàíà òîëüêî â òîì ñëó÷àå, åñëè
òðåáóåìûå îáú¸ìû ïàìÿòè äîñòàòî÷íî âåëèêè, è áîëüøîé îáú¸ì ïàìÿòè
ìîæåò çíà÷èòåëüíî óâåëè÷èòü ïðîèçâîäèòåëüíîñòü ðàáîòû. Åñëè æå
òðåáóåòñÿ 100-200 áàéò, òî äàæå òàêîé ó÷àñòîê, îêàçàâøèñü âîëåé ñëó÷àÿ
ïîñðåäè 16-ìåãàáàéòíîãî ïðîñòðàíñòâà, ìîæåò îñëîæíèòü æèçíü äðóãèì
ïðîãðàììàì...
3. Íà÷èíàÿ ñ âåðñèè 39 îïåðàöèîííîé ñèñòåìû (kickstart 3.0) åñòü
íîâûé ìåòîä ðàáîòû ñ ïàìÿòüþ - Memory Pools. Èñïîëüçîâàíèå ýòîãî
ìåòîäà ïîçâîëèò èçáåæàòü ñèëüíîé ôðàãìåíòàöèè ïàìÿòè, åñëè
èñïîëüçîâàíèå äèíàìè÷åñêîé ðàáîòû ñ ïàìÿòüþ íåîáõîäèìî. Ôðàãìåíòàöèè
ïðàêòè÷åñêè íå áóäåò äàæå ïðè èñïîëüçîâàíèè áîëüøèõ îáú¸ìîâ ïàìÿòè èç
ìíîæåñòâà ìàëåíüêèõ áëîêîâ. Ñóòü ìåòîäà â òîì, ÷òî ñèñòåìà
àâòîìàòè÷åñêè ïî íåîáõîäèìîñòè ðåçåðâèðóåò áëîêè ïàìÿòè îäèíàêîâîãî
çàäàííîãî îáú¸ìà, à òðåáóåìûå áëîêè ëþáîãî ðàçìåðà âûäåëÿþòñÿ óæå êàê
áû «âíóòðè» ýòèõ áëîêîâ. Êîãäà ïàìÿòü âíóòðè îäíîãî èç áëîêîâ
ôèêñèðîâàííîãî îáú¸ìà êîí÷àåòñÿ, ñèñòåìà àâòîìàòè÷åñêè çàõâàòûâàåò
íîâûé. Ñîîòâåòñòâåííî, åñëè âíóòðè áëîêà îñâîáîæäàåòñÿ ïîñëåäíèé èç
áëîêîâ ïðîèçâîëüíîãî ðàçìåðà, îí àâòîìàòè÷åñêè îñâîáîæäàåòñÿ. Íàáîð
áëîêîâ çàäàííîãî ðàçìåðà îáðàçóåò Memory Pool.
Äëÿ ñîçäàíèÿ Memory Pool èñïîëüçóåòñÿ ôóíêöèÿ Exec CreatePool.
Ÿ àðãóìåíòû - àòðèáóòû ïàìÿòè, êîòîðàÿ áóäåò ðåçåðâèðîâàòüñÿ ó
ñèñòåìû (D0 - òàêèå æå, êàê è ó AllocVec), ðàçìåð ôèêñèðîâàííîãî áëîêà
ïàìÿòè, èç êîòîðûõ è áóäåò ñîñòàâëÿòüñÿ Pool (D1) è ìèíèìàëüíûé îáú¸ì
ïàìÿòè, ïðè ïðåâûøåíèè êîòîðîãî çàõâàòûâàåìûå ó÷àñòêè ïàìÿòè áóäóò
ðàçìåùàòüñÿ íå â áëîêàõ çàäàííîãî ðàçìåðà âìåñòå ñ îñòàëüíûìè
ó÷àñòêàìè, à â ñâîèõ ñîáñòâåííûõ áëîêàõ (D2). Ýòîò îáú¸ì äîëæåí áûòü
ÌÅÍÜØÅ ÈËÈ ÐÀÂÅÍ îáú¸ìó áëîêà ôèêñèðîâàííîãî ðàçìåðà.
CreatePool âîçâðàùàåò óêàçàòåëü íà çàãîëîâîã Pool'à, ëèáî
íóëü â ñëó÷àå îøèáêè. Äëÿ òîãî, ÷òîáû çàõâàòèòü ó÷àñòîê ïàìÿòè
ïðîèçâîëüíîãî ðàçìåðà, íóæíî âîñïîëüçîâàòüñÿ ôóíêöèåé AllocPooled.
Åé ïåðåäà¸òñÿ çàãîëîâîê Pool'à (A0) è îáú¸ì òðåáóåìîé ïàìÿòè (D0).
Ýòà ôóíêöèÿ íå çàïîìèíàåò îáú¸ì çàòðåáîâàííîé ïàìÿòè, êàê AllocVec,
ïîýòîìó åãî íóæíî çàïîìèíàòü ñàìîñòîÿòåëüíî (â autodocs ïðèâåä¸í
èñõîäíûé òåêñò ôóíêöèè AllocVecPooled, ðàáîòàþùåé àíàëîãè÷íî
AllocVec).
Îñâîáîäèòü çàíèìàåìóþ ïàìÿòü ìîæíî òîæå «ïî êóñî÷êàì» ñ ïîìîùüþ
FreePooled. Îíà ïîëó÷àåò óêàçàòåëü íà çàãîëîâîê Pool'à (A0), àäðåñ
îñâîáîæäàåìîãî ó÷àñòêà (A1) è åãî äëèíó â áàéòàõ (D0). Òàê æå êàê è â
ñëó÷àå FreeVec, ìîæíî âîñïîëüçîâàòüñÿ ñîáñòâåííîé ôóíêöèåé
FreeVecPooled, èñõîäíèê êîòîðîé ïðèâåä¸í â autodocs.
Ôóíêöèÿ DeletePool óíè÷òîæàåò Memory Pool, àäðåñ çàãîëîâêà
êîòîðîãî åé ïåðåäàí (A0). Çàðåçåðâèðîâàííûå â ýòîì Pool'å ó÷àñòêè
ïàìÿòè îñâîáîæäàòü íå íóæíî - ýòî áóäåò ñäåëàíî àâòîìàòè÷åñêè.
11) Ñïèñêè
Ñïèñêè èñïîëüçóþòñÿ â ÎÑ ïîâñåìåñòíî êàê ìåõàíèçì õðàíåíèÿ íàáîðà
êàêèõ-ëèáî îáúåêòîâ. Íàïðèìåð, â ñïèñêè îðãàíèçóþòñÿ ó÷àñòêè
ñâîáîäíîé ïàìÿòè è áèáëèîòåêè. Ýëåìåíò ñïèñêà - ñòðóêòóðà äàííûõ Node
<exec/nodes.#?>, ñîäåðæàùàÿ ñëåäóþùèå ïîëÿ:
ln_Succ - óêàçàòåëü íà ñëåäóþùèé ýëåìåíò ñïèñêà
ln_Pred - óêàçàòåëü íà ïðåäûäóùèé ýëåìåíò
ln_Type - òèï ýëåìåíòà
ln_Pri - ïðèîðèòåò (äëÿ ñîðòèðîâêè)
ln_Name - óêàçàòåëü íà èìÿ ýëåìåíòà
Åñëè òàêèå íàâîðîòû íå òðåáóþòñÿ, èñïîëüçóåòñÿ ñòðóêòóðà MinNode,
ñîäåðæàùàÿ òîëüêî ïåðâûå äâà îïèñàííûõ ïîëÿ. Òàêèì îáðàçîì, ýòî
äâóñâÿçíûå ñïèñêè - ò.å., ïî ñïèñêó ìîæíî «äâèãàòüñÿ» â îáå ñòîðîíû.
Ñàì ñïèñîê îïèñûâàåòñÿ ñòðóêòóðàìè List/MinList <exec/lists.#?>.
Äëÿ ðàáîòû ñî ñïèñêàìè â Exec åñòü íàáîð ïîëåçíûõ ôóíêöèé:
AddHead() - äîáàâëåíèå ýëåìåíòà â íà÷àëî ñïèñêà
RemHead() - óäàëåíèå ýëåìåíòà èç íà÷àëà ñïèñêà
AddTail() - äîáàâëåíèå â êîíåö ñïèñêà
RemTail() - óäàëåíèå èç êîíöà ñïèñêà
Remove() - óäàëåíèå çàäàííîãî ýëåìåíòà èç ñïèñêà
Enqueue() ïðåäíàçíà÷åíà äëÿ äîáàâëåíèÿ ýëåìåíòà â î÷åðåäü, è
âñåãäà ñîõðàíÿåò ýëåìåíòû ñïèñêà â ïîðÿäêå ïðèîðèòåòîâ. FindName()
ïðîâîäèò ïîèñê èìåíîâàííîãî ýëåìåíòà ñïèñêà.
Ðàçóìååòñÿ, ýòè ôóíêöèè íå áóäóò ðàáîòàòü ñ MinNode/MinList.
Âñå ïåðå÷èñëåííûå ôóíêöèè ïðåäïîëàãàþò, ÷òî àðáèòðàæ äîñòóïà ñî
ñòîðîíû ðàçíûõ çàäà÷ ê ñïèñêàì âåä¸òñÿ çàäà÷åé ñàìîñòîÿòåëüíî (ñì.
íèæå î ñåìàôîðàõ).
12) Çàäà÷è
Çàäà÷è (Tasks) ÿâëÿþòñÿ îñíîâíîé ïðîãðàììíîé åäèíèöåé AmigaOS.
Ëþáàÿ çàïóùåííàÿ â äàííûé ìîìåíò ïðîãðàììà ÿâëÿåòñÿ çàäà÷åé. Êðîìå
òîãî, çàäà÷è ìîãóò ñîçäàâàòü íîâûå çàäà÷è äëÿ ðåàëèçàöèè ñâîèõ
ñîáñòâåííûõ öåëåé.
Ó êàæäîé çàäà÷è ìîæåò áûòü òðè ñîñòîÿíèÿ - âûïîëíÿåìàÿ (RUN),
ãîòîâàÿ ê âûïîëíåíèþ (READY) è ñîñòîÿíèå îæèäàíèÿ (WAIT). Î÷åâèäíî,
ïðîöåññîð ìîæåò â äàííûé ìîìåíò ôèçè÷åñêè âûïîëíÿòü òîëüêî îäèí êîä,
ïîýòîìó â êàæäûé êîíêðåòíûé ìîìåíò òîëüêî îäíà çàäà÷à èìååò ñòàòóñ
âûïîëíÿåìîé. Ó êàæäîé çàäà÷è åñòü ñâîé ïðèîðèòåò - áàéò ñî çíàêîì.
Äëÿ îïðåäåëåíèÿ ïîðÿäêà âûïîëíåíèÿ çàäà÷ îïåðàöèîííàÿ ñèñòåìà
ñîðòèðóåò èõ ñïèñîê ïî ïðèîðèòåòàì, è çàäà÷à ñ íàèâûñøèì ïðèîðèòåòîì,
ãîòîâàÿ ê âûïîëíåíèþ, âûïîëíÿåòñÿ ïåðâîé. Óïðàâëåíèå ìîæåò áûòü
ïåðåäàíî äðóãîé çàäà÷å â òð¸õ ñëó÷àÿõ: åñëè âûïîëíÿþùàÿñÿ çàäà÷à
ïåðåøëà â ñîñòîÿíèå îæèäàíèÿ, åñëè çàäà÷à ñ áîëüøèì ïðèîðèòåòîì
ïåðåøëà â ñîñòîÿíèå ãîòîâíîñòè, è åñëè ïðè íàëè÷èè ãîòîâîé ê
âûïîëíåíèþ çàäà÷è ñ òàêèì æå ïðèîðèòåòîì ó ðàññìàòðèâàåìîé çàäà÷è
êîí÷èëîñü âðåìÿ. Åñëè ãîòîâûõ ê âûïîëíåíèþ çàäà÷ ñ îäèíàêîâûì
ïðèîðèòåòîì íåñêîëüêî, ïðîöåññîð áóäåò «îáåãàòü» èõ ïî î÷åðåäè - òàê
ðåàëèçóåòñÿ ðàçäåëåíèå âðåìåíè, ïîçâîëÿþùåå îäíîâðåìåííî ðàáîòàòü
íåñêîëüêèì çàäà÷àì âû÷èñëèòåëüíîãî õàðàêòåðà.
Êàæäàÿ çàäà÷à èìååò ñòðóêòóòó Task <exec/tasks.#?>, â
êîòîðîé õðàíÿòñÿ å¸ ñâîéñòâà - ïðèîðèòåò, èìÿ è ïðî÷åå. Óêàçàòåëü íà
Task ìîæíî ïîëó÷èòü ñ ïîìîùüþ ôóíêöèè FindTask(), ïåðåäàâ åé óêàçàòåëü
(A1) íà èìÿ çàäà÷è. Åñëè çàäà÷å íóæåí óêàçàòåëü íà ñîáñòâåííóþ
ñòðóêòóðó, èñïîëíÿåòñÿ FindTask() ñ íóëåâûì àðãóìåíòîì. Çíàíèå àäðåñà
ñòðóêòóðû Task íåîáõîäèìî äëÿ ìåæçàäà÷íûõ êîììóíèêàöèé.
Êîãäà ýòî íåîáõîäèìî, çàäà÷à ìîæåò ñîçäàòü ëþáîå êîëè÷åñòâî
íóæíûõ åé ïîäçàäà÷. Ôóíêöèÿ CreateNewProc() èç dos.library ñîçäà¸ò
íîâóþ çàäà÷ó, âûïîëíÿÿ êîä Âàøåé æå çàäà÷è. Åé ïåðåäà¸òñÿ taglist,
ñîäåðæàùèé òýã NP_Entry - óêàçàòåëü íà âûïîëíÿåìóþ ôóíêöèþ. Çàäà÷à
íà÷èíàåò âûïîëíÿòüñÿ íåìåäëåííî, à ôóíêöèÿ âîçâðàùàåò óêàçàòåëü íà
ñòðóêòóðó Task (åñëè áûòü ïðåäåëüíî òî÷íûì, âîçâðàùàåòñÿ ñòðóêòóðà
Process, ñîäåðæàùàÿ ïåðâûì ýëåìåíòîì ñòðóêòóðó Task - íî îá ýòîì
ïîçæå). Çàäà÷à çàâåðøàåòñÿ âîçâðàòîì èç ôóíêöèè (rts) è àâòîìàòè÷åñêè
óíè÷òîæàåòñÿ.
Èìåéòå â âèäó, ÷òî ê ìîìåíòó âûõîäà èç Âàøåé ïðîãðàììû âñå
ïîäçàäà÷è äîëæíû áûòü çàâåðøåíû!  ïðîòèâíîì ñëó÷àå ïîñëåäóþùàÿ
ðàáîòîñïîñîáíîñòü ñèñòåìû íå ãàðàíòèðóåòñÿ.
13) Ñèãíàëû
Êàê óïîìèíàëîñü ðàíåå, çàäà÷à ìîæåò íàõîäèòüñÿ â ñîñòîÿíèè
îæèäàíèÿ.  ýòî ñîñòîÿíèå çàäà÷è âõîäÿò äëÿ îæèäàíèÿ êàêèõ-ëèáî
âíåøíèõ (äëÿ ýòîé çàäà÷è) ñîáûòèé, êîòîðûå ìîãóò áûòü èíèöèèðîâàíû êàê
äðóãèìè çàäà÷àìè, òàê è ïåðèôåðèåé êîìüþòåðà. Ñèãíàëû èñïîëüçóþòñÿ
äëÿ âçàèìîäåéñòâèÿ çàäà÷, ýòî ïðîñòåéøèé òèï èõ âçàèìîäåéñòâèÿ, íà
êîòîðîì ïîñòðîåíû âñå îñòàëüíûå.  ÷àñòíîñòè, ñèãíàëû èñïîëüçóþòñÿ
äëÿ òîãî, ÷òîáû âûâåñòè çàäà÷ó èç ñîñòîÿíèÿ îæèäàíèÿ.
Ëþáàÿ çàäà÷à ìîæåò ïîñëàòü ëþáîé ñèãíàë ëþáîé çàäà÷å. Äëÿ ýòîãî
èñïîëüçóåòñÿ ôóíêöèÿ Exec'à Signal(), àðãóìåíòàìè êîòîðîé ñëóæàò
óêàçàòåëü íà ñòðóêòóðó Task çàäà÷è-«ïðè¸ìíèêà», êîòîðîé ïîñûëàåòñÿ
ñèãíàë (A1) è ìàñêà ñèãíàëîâ (D0). Ïðè ýòîì íå èìååò çíà÷åíèÿ, â
êàêîì ñîñòîÿíèè íàõîäèòñÿ ïðèíèìàþùàÿ ñèãíàë çàäà÷à. Åñëè çàäà÷à
íàõîäèòñÿ â ñîñòîÿíèè îæèäàíèÿ ýòîãî ñèãíàëà, îíà ïåðåõîäèò â
ñîñòîÿíèå ãîòîâíîñòè ê âûïîëíåíèþ. Åñëè ñèãíàë ïîäàí çàäà÷å,
íàõîäÿùåéñÿ â ñîñòîÿíèè ãîòîâíîñòè, îí áóäåò çàïîìíåí, è ïðè ïåðåõîäå
â ñîñòîÿíèå îæèäàíèÿ çàäà÷à îñòàíåòñÿ â ñîñòîÿíèè ãîòîâíîñòè.
Ñèãíàë ïðåäñòàâëÿåò ñîáîé îäèí èç áèòîâ 32-áèòíîãî ñëîâà.
Îäíîâðåìåííî ìîæíî ïîñëàòü êàê îäèí, òàê è íåñêîëüêî ñèãíàëîâ -
óñòàíîâèâ ñîîòâåòñòâóþùèå áèòû. Òî÷íî òàê æå ëþáàÿ çàäà÷à ìîæåò
îæèäàòü êàê îäèí, òàê è íåñêîëüêî ñèãíàëîâ. Ïåðåõîä èç ñîñòîÿíèÿ
îæèäàíèÿ â ñîñòîÿíèå ãîòîâíîñòè ïðîèñõîäèò òîëüêî ëèøü â òîì ñëó÷àå,
êîãäà ïðèõîäèò õîòÿ áû îäèí èç îæèäàåìûõ ñèãíàëîâ - åñëè íè îäèí èç
áèòîâ îæèäàåìûõ íå ñîîòâåòñòâóåò ïðèøåäøåìó, çàäà÷à íå ïåðåéä¸ò â
ñîñòîÿíèå ãîòîâíîñòè (îäíàêî, ñèãíàë áóäåò çàïîìíåí!). Êîãäà çàäà÷à
ïåðåøëà â ñîñòîÿíèå ãîòîâíîñòè, îíà ìîæåò ïðîàíàëèçèðîâàòü, êàêèå
èìåííî ñèãíàëû åé ïîëó÷åíû, è íà îñíîâàíèè ýòîãî ñäåëàòü âûâîäû, êòî
êîíêðåòíî è ÷òî îò íåå õî÷åò. Äëÿ òîãî, ÷òîáû âûÿñíèòü, ïðèõîäèë ëè
çà âðåìÿ ðàáîòû çàäà÷è ñèãíàë, åé íå îáÿçàòåëüíî ïåðåõîäèòü â
ñîñòîÿíèå îæèäàíèÿ - ñèñòåìà äà¸ò âîçìîæíîñòü ïðî÷èòàòü òåêóùåå
ñîñòîÿíèå ñèãíàëîâ. Äëÿ ýòîãî èñïîëüçóåòñÿ ôóíêöèÿ dos.library
CheckSignal(), àðãóìåíòîì êîòîðîé (D1) ñëóæèò ìàñêà ïðîâåðÿåìûõ
ñèãíàëîâ, à ðåçóëüòàòîì - ñèãíàëû, óñòàíîâëåííûå íà äàííûé ìîìåíò.
Âñå óêàçàííûå ôóíêöèè ñèãíàëû áóäóò ñáðîøåíû.
Ñèãíàëû èñïîëüçóþòñÿ, íàïðèìåð, äëÿ îáðàáîòêè íàæàòèÿ êëàâèø
CTRL/C - åñëè âî âðåìÿ ðàáîòû ïðîãðàììû â Shell íàæàòü CTRL/C, çàäà÷å
áóäåò ïîñëàí ñîîòâåòñòâóþùèé ñèãíàë. Îáðàáàòûâàòü åãî èëè íåò - ýòî
óæå äåëî ñàìîé çàäà÷è. Ïîñêîëüêó êîëè÷åñòâî ñèãíàëîâ îãðàíè÷åíî,
íåêîòîðûå èç íèõ èìåþò ñïåöèàëüíîå ñëóæåáíîå íàçíà÷åíèå. Ñèãíàëû 12,
13, 14, 15 (òî åñòü áèòû ïî ìàñêå f000) ñîîòâåòñòâóþò íàæàòèþ
êîìáèíàöèé êëàâèø CTRL+C,D,E,F. Îñòàëüíûå (0-11) èñïîëüçóþòñÿ
ñèñòåìîé äëÿ âíóòðåííèõ íóæä. Äëÿ ñâîèõ öåëåé çàäà÷è ìîãóò
èñïîëüçîâàòü ñèãíàëû íà÷èíàÿ ñ 16-ãî.
Ïîñêîëüêó çàäà÷à ìîæåò ðàáîòàòü êàê áû â ðàìêàõ äðóãîé çàäà÷è
(ýòî íàçûâàåòñÿ «ðàáîòàòü â êîíòåêñòå âûçûâàþùåé çàäà÷è» - òàê,
íàïðèìåð, shell çàïóñêàåò ïðîãðàììû), íåêîòîðûå ñèãíàëû ê ìîìåíòó
çàïóñêà çàäà÷è ìîãóò áûòü óæå çàíÿòû. Äëÿ òîãî, ÷òîáû èñïîëüçîâàòü
òîëüêî íåçàíÿòûå ñèãíàëû, Exec ïðåäîñòàâëÿåò âîçìîæíîñòü äèíàìè÷åñêîãî
ðåçåðâèðîâàíèÿ ñèãíàëîâ. Ê ïðèìåðó, åñëè Âàøà çàäà÷à õî÷åò ïîëó÷àòü
îò êîãî-ëèáî ñèãíàë, îíà äîëæíà âûçâàòü ôóíêöèþ Exec'à AllocSignal. Â
êà÷åñòâå àðãóìåíòà (D0) ïåðåäà¸òñÿ áàéò -1, è â ðåçóëüòàòå
âîçâðàùàåòñÿ íîìåð ñèãíàëà, ëèáî -1, åñëè ñâîáîäíûõ ñèãíàëîâ íåò.
Ïîëó÷åííîå ÷èñëî íóæíî çàïîìíèòü. Äëÿ ïîëó÷åíèÿ áèòîâîé ìàñêè ñèãíàëà
èñïîëüçóéòå ýòî ÷èñëî êàê àðãóìåíò ñäâèãà åäèíèöû âëåâî.
Ýòà æå ôóíêöèÿ èñïîëüçóåòñÿ ñèñòåìíûìè ôóíêöèÿìè äëÿ ðàáîòû ñ
ñèãíàëàìè, ÷òî ïîçâîëÿåò èçáåæàòü êîíôëèêòîâ ñ óæå èñïîëüçóåìûìè
çàäà÷åé ñèãíàëàìè.
Ïåðåä âûõîäîì èç çàäà÷è çàðåçåðâèðîâàííûé ñèãíàë íåîáõîäèìî
îñâîáîäèòü! Ýòî äåëàåò FreeSignal(), ïîëó÷àþùåé (D0) íîìåð ñèãíàëà.
Äëÿ ïåðåõîäà çàäà÷è â ñîñòîÿíèå îæèäàíèÿ âûçûâàåòñÿ ôóíêöèÿ
Wait() - àðãóìåíòîì êîòîðîé (D0) ÿâëÿåòñÿ áèòîâàÿ ìàñêà îæèäàåìûõ
ñèãíàëîâ. Çàäà÷à ïåðåéä¸ò â ñîñòîÿíèå ãîòîâíîñòè ïîñëå ïîëó÷åíèÿ
ñèãíàëîâ, õîòÿ áû îäèí èç êîòîðûõ ñîâïàä¸ò ñ îæèäàåìûì (èëè ñðàçó æå,
åñëè ýòè ñèãíàëû áûëè óæå ïîñëàíû ðàíåå).
«Èçíóòðè» ñèãíàëû óñòðîåíû ïðîñòî - ó êàæäîé çàäà÷è åñòü
ñëóæåáíàÿ ñòðóêòóðà, â êîòîðîé îäíî èç ñëîâ ñëóæèò äëÿ çàïîìèíàíèÿ
ñèãíàëîâ. Êîãäà ýòîé çàäà÷å ïîñûëàåòñÿ ñèãíàë, ñîîòâåòñòâóþùèé åìó
áèò óñòàíàâëèâàåòñÿ â ýòîì ñëîâå. Åñëè óñòàíîâëåííûå â ðåçóëüòàòå
áèòû ñîâïàäàþò õîòÿ áû ñ îäíèì èç îæèäàåìûõ çàäà÷åé ñèãíàëîâ, îíà
ïåðåõîäèò â ñîñòîÿíèå ãîòîâíîñòè ê âûïîëíåíèþ. Åñëè çàäà÷à áûëà
ãîòîâà ê âûïîëíåíèþ, ýòè áèòû ïðîñòî çàïîìèíàþòñÿ. Ïîëó÷åíèå æå
ñèãíàëà ñáðàñûâàåò ñîîòâåòñòâóþùèé åìó áèò, è äåëàåò çàäà÷ó ãîòîâîé ê
ïîâòîðíîìó ïðè¸ìó ñèãíàëà.
Åñëè çàäà÷à ïîëó÷àåò íåñêîëüêî ñèãíàëîâ ïîäðÿä, îíà çàïîìèíàåò
òîëüêî îäèí. Äëÿ òîãî, ÷òîáû çàïîìíèòü ñåðèþ îáðàùåíèé îò çàäà÷è ê
çàäà÷å, èñïîëüçóþòñÿ ñîîáùåíèÿ (messages).
Ñóùåñòâóåò âîçìîæíîñòü âûçîâà ïîëüçîâàòåëüñêîé ôóíêöèè â
êîíòåêñòå çàäà÷è â ñëó÷àå ïîëó÷åíèÿ çàäàííîãî íàáîðà ñèãíàëîâ.
Ôóíêöèÿ SetExcept() ïîçâîëÿåò îïðåäåëèòü óñëîâèÿ âîçíèêíîâåíèÿ ýòîé
ñèòóàöèè, à â ïîëå tc_ExceptCode ñòðóêòóðû Task çàäà÷è äîëæåí áûòü
ïðîïèñàí óêàçàòåëü íà âûçûâàåìóþ ôóíêöèþ. Áîëåå ïîäðîáíî ÷èòàéòå â
exec.doc.
14) Ñîîáùåíèÿ
Ñîîáùåíèÿ èñïîëüçóþòñÿ â òåõ ñëó÷àÿõ, êîãäà çàäà÷ó íóæíî íå
ïðîñòî ïðîèíôîðìèðîâàòü î ôàêòå ñîáûòèÿ, íî è ïåðåäàòü êàêóþ-ëèáî
èíôîðìàöèþ. Êðîìå òîãî, ñîîáùåíèÿ âûñòðàèâàþòñÿ â î÷åðåäü, è çàäà÷à
ïîëó÷àåò ÂÑÅ ñîîáùåíèÿ, êîòîðûå åé áûëè ïåðåäàíû. Ñîîáùåíèÿ «èçíóòðè»
ïîñòðîåíû íà ñëóæåáíûõ ñèãíàëàõ çàäà÷è.
Äëÿ ïåðåäà÷è ñîîáùåíèÿ äîëæåí ñóùåñòâîâàòü ñâÿçíîé ïîðò (message
port). Åñëè ñèãíàë àäðåñóåòñÿ çàäà÷å, òî ñîîáùåíèå àäðåñóåòñÿ ïîðòó.
Ïîðò ñîçäà¸òñÿ òîé çàäà÷åé, êîòîðàÿ ñîáèðàåòñÿ ïðèíèìàòü ñîîáùåíèÿ.
Îòïðàâëÿòü ñîîáùåíèÿ ìîæåò ëþáàÿ çàäà÷à.
Äëÿ ñîçäàíèÿ ïîðòà èñïîëüçóåòñÿ ôóíêöèÿ Exec CreateMsgPort().
Ôóíêöèÿ íå èìååò àðãóìåíòîâ è âîçâðàùàåò óêàçàòåëü íà ñîçäàííûé ïîðò
ëèáî íóëü ïðè îøèáêå. Êðîìå òîãî, ýòà ôóíêöèÿ çàõâàòûâàåò ñèãíàë.
Íîìåð ñèãíàëà õðàíèòñÿ â ñîçäàííîé ñòðóêòóðå è ìîæåò áûòü èñïîëüçîâàí
äëÿ îæèäàíèÿ ñîîáùåíèé îò íåñêîëüêèõ ïîðòîâ îäíîâðåìåííî (îá ýòîì
äàëåå). Êîãäà íàäîáíîñòè â ñâÿçíîì ïîðòó áîëüøå íåò, ôóíêöèÿ
DeleteMsgPort() (óêàçàòåëü íà ïîðò â A0) îñâîáîäèò ñèãíàë è çàíÿòóþ
ñòðóêòóðîé ïàìÿòü.
Ïîðòû ìîãóò áûòü îáùåäîñòóïíûìè (public). Public-ïîðòû
îòëè÷àþòñÿ òåì, ÷òî èìåþò ÈÌß è íàõîäÿòñÿ â ñèñòåìíîì ñïèñêå
public-ïîðòîâ. Ëþáàÿ äðóãàÿ çàäà÷à â ýòîì ñëó÷àå ìîæåò íàéòè
íóæíûé åé ïîðò ïî èìåíè è îòïðàâèòü ñîîáùåíèå. Èìåííî òàêèì
îáðàçîì ðàáîòàþò REXX-ïîðòû ïðîãðàìì.
Äëÿ äîáàâëåíèÿ ïîðòà â ñèñòåìíûé ñïèñîê èñïîëüçóåòñÿ ôóíêöèÿ Exec
AddPort(), àðãóìåíòîì (A1) ïîëó÷àþùàÿ óêàçàòåëü íà ïîðò. Ïåðåä
äîáàâëåíèåì ïîðòà â ñïèñîê ïðèñâîéòå åìó èìÿ - ïîëîæèòå â ïîëå èìåíè
ýëåìåíòà ñïèñêà óêàçàòåëü íà òåêñòîâóþ ñòðîêó.
Äëÿ óäàëåíèÿ èç ñèñòåìíîãî ñïèñêà èñïîëüçóåòñÿ RemPort().
Ñîîáùåíèÿ ïðåäñòàâëÿþò ñîáîé ñòðóêòóðû äàííûõ ïåðåäàþùåé
ïðîãðàììû. Îíè èìåþò â íà÷àëå îáÿçàòåëüíóþ ñòðóêòóðó Message
<exec/ports.#?>, çà êîòîðîé ñëåäóþò ïðîèçâîëüíûå ïîëüçîâàòåëüñêèå
äàííûå. Ðàçìåð ñîîáùåíèÿ âìåñòå ñî ñòðóêòóðîé - äî 65535 áàéò,
õðàíèòñÿ ïåðåä ñàìèìè äàííûìè (ïîëå mn_Length).
Ñîîáùåíèå ïåðåäà¸òñÿ ôóíêöèåé PutMsg(), ïîëó÷àþùåé óêàçàòåëü íà
ïîðò (A0) è ñîîáùåíèå (A1). Ñîîáùåíèå ïðè ýòîì ñòàâèòñÿ â î÷åðåäü, è
âûçâàâøàÿ ôóíêöèþ çàäà÷à òóò æå ïîëó÷àåò óïðàâëåíèå. Ñîîáùåíèå íèêóäà
íå êîïèðóåòñÿ, ïîýòîìó èçìåíÿòü ñîîáùåíèå íåëüçÿ äî òåõ ïîð, ïîêà
àäðåñàò íå ïîëó÷èò ýòî ñîîáùåíèå è íå «ðàñïèøåòñÿ» â åãî ïîëó÷åíèè
ôóíêöèåé ReplyMsg() - èíà÷å îí ïîëó÷èò åãî èçìåí¸ííûì (îá ýòîì íèæå).
Ïîëó÷àòåëü ïðèíèìàåò ñîîáùåíèÿ ïðè ïîìîùè ôóíêöèè GetMsg(),
åäèíñòâåííûì àðãóìåíòîì êîòîðîé ÿâëÿåòñÿ ïîðò (A0). Åñëè â î÷åðåäè
áûëî íåñêîëüêî ñîîáùåíèé, òî êàæäûé âûçîâ GetMsg() áóäåò âûòàñêèâàòü
î÷åðåäíîå. Êîãäà ñîîáùåíèÿ êîí÷àòñÿ, GetMsg() âåðí¸ò íóëü. Åñëè
çàäà÷å íóæíî ïîäîæäàòü ïðèõîäà ñîîáùåíèÿ, òî ïðîñòåéøèé ñïîñîá ýòî
ñäåëàòü - ôóíêöèÿ WaitPort(), îïÿòü æå ïîëó÷àþùàÿ óêàçàòåëü íà ïîðò
(A0). Ïîêà ñîîáùåíèé íåò, çàäà÷à ïåðåéä¸ò â ñîñòîÿíèå îæèäàíèÿ.
Êîãäà ïðèøëî õîòÿ áû îäíî ñîîáùåíèå, WaitPort() âîçâðàùàåò óêàçàòåëü
íà ïåðâîå ñîîáùåíèå â î÷åðåäè, ÍÎ ÍÅ ÂÛÍÈÌÀÅÒ ÑÎÎÁÙÅÍÈß! Òî åñòü,
ïîñëå å¸ âûçîâà ñëåäóåò âûïîëíÿòü GetMsg() äî òåõ ïîð, ïîêà ñîîáùåíèÿ
íå êîí÷àòñÿ.
 ïðîñòåéøåì ñëó÷àå ñîîáùåíèÿ ìîãóò íå íåñòè èíôîðìàòèâíîé
íàãðóçêè, ïðîñòî ñîîáùàÿ î ôàêòàõ êàêîãî-òî ñîáûòèÿ. Îäíàêî, î÷åíü
÷àñòî òðåáóåòñÿ ïåðåäàâàòü âïîëíå êîíêðåòíóþ èíôîðìàöèþ - àðãóìåíòû,
ìàññèâû...  ýòîì ñëó÷àå ïðîãðàììà-ïåðåäàò÷èê îáû÷íî çàõâàòûâàåò
îáëàñòü ïàìÿòè ïîä ñîîáùåíèå, ñêëàäûâàåò òóäà íåîáõîäèìóþ èíôîðìàöèþ,
è äîëæíà êàêèì-òî îáðàçîì âûÿñíèòü ìîìåíò, êîãäà ñîîáùåíèå áóäåò
ïîëó÷åíî, ÷òîáû îñâîáîäèòü ýòó ïàìÿòü. Äëÿ ýòîãî ñóùåñòâóåò ìåõàíèçì
Reply-ïîðòîâ.
Ïðîãðàììà-ïåðåäàò÷èê â äàííîì ñëó÷àå äîëæíà ñîçäàòü ñâîé ïîðò,
è çàíåñòè óêàçàòåëü íà íåãî â ïîëå mn_ReplyPort ñâîåãî ñîîáùåíèÿ.
Ïðîãðàììà-ïðè¸ìíèê ïîñëå ïðè¸ìà ñîîáùåíèÿ è èñïîëüçîâàíèÿ äàííûõ èç
íåãî äîëæíà âûçâàòü ôóíêöèþ ReplyMsg() ñ óêàçàòåëåì íà ñîîáùåíèå (A1).
Ñ ýòîãî ìîìåíòà ïðè¸ìíèêó óæå íåëüçÿ èñïîëüçîâàòü ñîîáùåíèå.
Ïåðåäàò÷èê æå ïîëó÷èò â ñâîé ReplyPort ñâî¸ ñîîáùåíèå îáðàòíî -
÷òî è ÿâëÿåòñÿ òîé ñàìîé «ðàñïèñêîé î ïîëó÷åíèè».
15) Îæèäàíèå ñîîáùåíèé îò íåñêîëüêèõ ïîðòîâ îäíîâðåìåííî
Êàê áûëî óïîìÿíóòî ðàíåå, ìåõàíèçì ñîîáùåíèé ïîñòðîåí íà
ñèãíàëàõ. Â ñòðóêòóðå, îïèñûâàþùåé ïîðò, åñòü ïîëå mp_SigBit,
õðàíÿùåå íîìåð áèòà ñèãíàëà, êîòîðûé áóäåò ïîëó÷åí âëàäåëüöåì ïîðòà ïî
ïðèõîäó ñîîáùåíèÿ - ëþáîå ñîîáùåíèå âûçûâàåò ïîñûëêó ýòîãî ñèãíàëà.
Ïîñêîëüêó WaitPort() ïîçâîëÿåò îæèäàòü ïðèõîäà ñîîáùåíèÿ
òîëüêî â îäèí ïîðò, äëÿ îæèäàíèÿ ñîîáùåíèé â íåñêîëüêèõ ïîðòàõ ðàçîì
èñïîëüçóåòñÿ äðóãîé ïîäõîä. Èç âñåõ ïîðòîâ, ñîîáùåíèÿ èç êîòîðûõ ìû
æä¸ì (îæèäàþùàÿ çàäà÷à äîëæíà áûòü âëàäåëüöåì âñåõ ýòèõ ïîðòîâ - òî
åñòü èìåííî îíà äîëæíà èõ ñîçäàòü!) âûáèðàåì mp_SigBit, ðàçâîðà÷èâàåì
â ìàñêó ñèãíàëà è ñêëàäûâàåì âñå ñèãíàëû ëîãè÷åñêîé îïåðàöèåé ÈËÈ â
îäíî 32-áèòíîå ÷èñëî. Ýòî ÷èñëî áóäåò àðãóìåíòîì ôóíêöèè Wait().
Òåïåðü, ñòîèò ïðèéòè õîòÿ áû îäíîìó ñîîáùåíèþ, çàäà÷à ñðàçó æå
âûéäåò èç ñîñòîÿíèÿ îæèäàíèÿ. Ïîñêîëüêó êàæäûé ïîðò îáû÷íî èìååò ñâîé
íîìåð áèòà ñèãíàëà, ïî ðåçóëüòàòó Wait() íåòðóäíî äîãàäàòüñÿ, â êàêîé
èìåííî ïîðò ïðèøëî ñîîáùåíèå.
Ïîñêîëüêó êîëè÷åñòâî ïîëüçîâàòåëüñêèõ ñèãíàëîâ îãðàíè÷åíî, ïðè
ðàáîòå ñ äîñòàòî÷íî áîëüøèì êîëè÷åñòâîì ïîðòîâ ïðèä¸òñÿ ñîçäàâàòü
ïîðòû ñàìîìó, ðàñøàðèâàÿ îäèí ñèãíàë íà íåñêîëüêî ïîðòîâ ðàçîì. Ïðè
òàêîì ðàñêëàäå óæå ïðèä¸òñÿ ïîñëåäîâàòåëüíî îïðàøèâàòü ãðóïïó ïîðòîâ,
÷òîáû âûÿñíèòü, êóäà ïðèøëî ñîîáùåíèå.
Ïîñêîëüêó âñÿ êîììóíèêàöèÿ â AmigaOS ïîñòðîåíà íà ñèãíàëàõ è
ñîîáùåíèÿõ, ýòîò æå ïîäõîä ìîæíî èñïîëüçîâàòü äëÿ îæèäàíèÿ ëþáîé
ãðóïïû ñîáûòèé.
16) Ñåìàôîðû
Ñåìàôîðû ÿâëÿþòñÿ ñðåäñòâîì ðàçãðàíè÷åíèÿ äîñòóïà ê ðàçäåëÿåìûì
ðåñóðñàì ñî ñòîðîíû íåñêîëüêèõ çàäà÷.
Ïðåäïîëîæèì, ÷òî ó íàñ åñòü íåêàÿ îáëàñòü ïàìÿòè, êóäà çàäà÷à Èêñ
ñêëàäûâàåò òåêñòîâóþ ñòðîêó, à çàäà÷à Èãðåê å¸ îòòóäà ñ÷èòûâàåò.
Ïîñêîëüêó Àìèãà - ìàøèíà ìíîãîçàäà÷íàÿ, âïîëíå ìîæåò ñëîæèòüñÿ òàêàÿ
ñèòóàöèÿ, ÷òî ïðîãðàììà Èãðåê çàëåçëà â ñòðîêó èìåííî â òîò ñàìûé
ìîìåíò, êîãäà Èêñ óñïåë âûëîæèòü òîëüêî ïîëîâèíó î÷åðåäíîé ñòðîêè.
Òàêèì îáðàçîì, òî, ÷òî ñ÷èòàåò Èãðåê, áóäåò ïðåäñòàâëÿòü ñîáîé
ïîëîâèíó íîâîé ñòðîêè è ïîëîâèíó ñòàðîé.
Ôóíêöèÿ InitSemaphore(), ïîëó÷àþùàÿ óêàçàòåëü íà ñòðóêòóðó
SignalSemaphore (A0), èíèöèàëèçèðóåò ñåìàôîð. Ôóíêöèÿ íè÷åãî íå
çàõâàòûâàåò, âûïîëíÿÿ òîëüêî èíèöèàëèçàöèþ. Ñ ýòîãî ìîìåíòà ñåìàôîð
ãîòîâ ê ðàáîòå.
Êîãäà çàäà÷à õî÷åò ïîëó÷èòü äîñòóï ê ðàçäåëÿåìîìó ðåñóðñó
(íàïðèìåð, óïîìÿíóòîìó ó÷àñòêó ïàìÿòè), îíà äîëæíà âûçâàòü ôóíêöèþ
ObtainSemaphore(), ïîëó÷àþùóþ óêàçàòåëü íà óïîìÿíóòóþ âûøå ñòðóêòóðó
(A0). Åñëè íèêòî áîëåå â äàííûé ìîìåíò íå èñïîëüçóåò ñòðóêòóðó,
çàäà÷à ïðîäîëæèò âûïîëíåíèå. Êîãäà îïåðàöèÿ ñ ðåñóðñîì çàâåðøåíà,
çàäà÷à äîëæíà âûïîëíèòü ReleaseSemaphore() ñ òåì æå àðãóìåíòîì.
Åñëè â ìîìåíò ìåæäó ObtainSemaphore() è ReleaseSemaphore(),
âûïîëíÿåìûìè êàêîé-ëèáî çàäà÷åé, êàêàÿ-òî åù¸ çàäà÷à âûïîëíèò òó æå
ïðîöåäóðó, ïåðåäàâ óêàçàòåëü íà òîò æå ñåìàôîð - îíà áóäåò ïåðåâåäåíà
â ñîñòîÿíèå îæèäàíèÿ äî òåõ ïîð, ïîêà «âëàäåëåö» ñåìàôîðà íå âûïîëíèò
ReleaseSemaphore(). Ñ ýòîãî ìîìåíòà çàäà÷à ïîëó÷èò óïðàâëåíèå. Åñëè
â òàêóþ ñèòóàöèþ ïîïàä¸ò íåñêîëüêî çàäà÷, îíè áóäóò ïîñòàâëåíû â
î÷åðåäü è áóäóò ïîëó÷àòü óïðàâëåíèå ïîî÷åð¸äíî.
Åñëè çàäà÷à õî÷åò âñåãî ëèøü óçíàòü, ñâîáîäåí ëè ðåñóðñ â äàííûé
ìîìåíò, íå ïåðåõîäÿ â ñîñòîÿíèå îæèäàíèÿ - äëÿ ýòîãî ñóùåñòâóåò
ôóíêöèÿ AttemptSemaphore(). Ðåçóëüòàò å¸ - TRUE (íå íóëü), åñëè
ðåñóðñ ñâîáîäåí.  ýòîì ñëó÷àå âûçîâ AttemptSemaphore() èäåíòè÷åí
âûçîâó ObtainSemaphore() - òî åñòü, çàäà÷à ñòàíîâèòñÿ âëàäåëüöåì
ðåñóðñà, è äîëæíà âûïîëíèòü ReleaseSemaphore() ïî çàâåðøåíèè ðàáîòû ñ
íèì. Åñëè ðåçóëüòàò áûë FALSE (0) - çíà÷èò, ðåñóðñ óæå êåì-òî çàíÿò.
Ñóùåñòâóþò áîëåå ñëîæíûå ñëó÷àè, íå âïèñûâàþùèåñÿ â ýòîò
ìåõàíèçì. Íàïðèìåð, ìîæåò áûòü ñïèñîê, ó êîòîðîãî åñòü îäèí
«ïèñàòåëü» è ìíîæåñòâî «÷èòàòåëåé». Î÷åâèäíî, ÷òî «÷èòàòåëè» äðóã
äðóãó íå ìåøàþò íèêîèì îáðàçîì, è ïîýòîìó íåò ñìûñëà ðàçãðàíè÷èâàòü
äîñòóï ìåæäó íèìè. À ñ äðóãîé ñòîðîíû, äîëæíà áûòü âîçìîæíîñòü ðàçîì
îòñå÷ü âñåõ «÷èòàòåëåé», êîãäà àêòèâèçèðóåòñÿ «ïèñàòåëü». Óïîìÿíóòûé
ðàíåå ìåõàíèçì ïðåäíàçíà÷åí äëÿ «ïèñàòåëåé», êîòîðûå äîëæíû îáëàäàòü
èñêëþ÷èòåëüíûì äîñòóïîì ê ðåñóðñó, çàùèùàåìîìó ñåìàôîðîì. Äëÿ
«÷èòàòåëåé» æå åñòü åù¸ äâå ôóíêöèè - ObtainSemaphoreShared() è
AttemptSemaphoreShared(), êîòîðûå ïîçâîëÿþò ïðèìåíÿþùèì èõ «óæèâàòüñÿ»
íà ðåñóðñå îäíîâðåìåííî. Ýòè ôóíêöèè, êðîìå òîãî, äîïóñêàþò ïàðû
âëîæåííûõ âûçîâîâ. Äëÿ îñâîáîæäåíèÿ ðåñóðñà ïðèìåíÿåòñÿ âñ¸ òîò æå
ReleaseSemaphore().
Åñëè çàäà÷à õî÷åò ïîëó÷èòü äîñòóï ê ãðóïïå ðåñóðñîâ ðàçîì, ìîæåò
áûòü ïîëåçíî îáúåäèíåíèå ñåìàôîðîâ â ñïèñîê. ObtainSemaphoreList(),
ïîëó÷àþùàÿ â êà÷åñòâå àðãóìåíòà ñïèñîê ñåìàôîðîâ (A0), âûïîëíÿåò
Obtain äëÿ íèõ âñåõ îäíîâðåìåííî. Ýòîò âàðèàíò ïðåäïî÷èòåëüíåå
ïîñëåäîâàòåëüíîãî âûïîëíåíèÿ Obtain, ïîñêîëüêó íå ìîæåò ïðèâåñòè ê
âçàèìíîé áëîêèðîâêå çàäà÷ (deadlock), åñëè äðóãàÿ çàäà÷à çàõî÷åò
ïðîâåñòè òî æå ñàìîå â äðóãîì ïîðÿäêå.
Òàê æå, êàê è ïîðòû, ñåìàôîðû ìîãóò áûòü îáùåñèñòåìíî äîñòóïíû.
Äëÿ ýòîãî âìåñòî InitSemaphore() âûïîëíÿåòñÿ AddSemaphore(). Ïåðåä
ýòèì íåîáõîäèìî èíèöèàëèçèðîâàòü ïîëå èìåíè (ss_Link.ln_Name).
Îáðàòíàÿ îïåðàöèÿ - RemSemaphore().
Ïàðàëëåëüíî ñ îïèñàííûì ñèíõðîííûì ìåõàíèçìîì ñåìàôîðîâ, â
AmigaOS ðåàëèçîâàí òàêæå è àñèíõðîííûé ìåõàíèçì, ïîñòðîåííûé íà
ñîîáùåíèÿõ. Äëÿ ýòîãî ïðèìåíÿåòñÿ ïàðà ôóíêöèé Procure()/Vacate().
Çàäà÷à, êîòîðîé òðåáóåòñÿ ðàáîòà ñ ðåñóðñîì, äîëæíà èìåòü ãîòîâûé
ReplyPort è ñîîáùåíèå (ñòðóêòóðà SemaphoreMessage, îïèñàíèå ñìîòðèòå â
<exec/semaphores.#?>, êîòîðîå ïåðåäà¸òñÿ âòîðûì àðãóìåíòîì (A1)
ôóíêöèè Procure(). Ïîëå ssm_Message.ln_Name äîëæíà ñîäåðæàòü 1 äëÿ
îáû÷íîãî (exclusive) äîñòóïà è 0 äëÿ ðàçäåëÿåìîãî (shared). Îñòàëüíûå
çíà÷åíèÿ íåäîïóñòèìû. Êîãäà ðåñóðñ ñòàíåò ñâîáîäåí, îí ñðàçó ñòàíåò
àâòîìàòè÷åñêè çàõâà÷åí, è çàäà÷à ïîëó÷èò ñîîáùåíèå íà ñâîé ReplyPort.
Ýòîò ìåõàíèçì ïîçâîëÿåò, â ÷àñòíîñòè, îæèäàòü îñâîáîæäåíèÿ äàæå
íåñêîëüêèõ ñåìàôîðîâ ðàçîì.
Ôóíêöèÿ Vacate() èñïîëüçóåòñÿ êàê ïàðà ê Procure() äëÿ
îñâîáîæäåíèÿ çàíÿòîãî ðåñóðñà. Àðãóìåíòû ó íå¸ òå æå. Ôóíêöèÿ ìîæåò
áûòü âûïîëíåíà â ëþáîé ìîìåíò, â òîì ÷èñëå è ðàíüøå, ÷åì ïðèä¸ò
ñîîáùåíèå îá îñâîáîæäåíèè - òåì ñàìûì ïðåðûâàÿ âûïîëíåíèå Procure().
Ïîëå ssm_Semaphore áóäåò î÷èùåíî, ïðèä¸ò îòâåò, åñëè îí åù¸ íå áûë
ïîëó÷åí.
17) Ðåñóðñû
Ðåñóðñû (resources) ïðåäñòàâëÿþò ñîáîé åù¸ îäèí «êèðïè÷èê»
AmigaOS. Îíè âûïîëíÿþò ôóíêöèþ, ïîõîæóþ íà ôóíêöèþ ñåìàôîðîâ.
Ðåñóðñû ïðåäíàçíà÷åíû äëÿ ðàçãðàíè÷åíèÿ äîñòóïà ê ðàçëè÷íûì àïïàðàòíûì
êîìïîíåíòàì Àìèãè. Ïðèâåä¸ì ñïèñîê èìåþùèõñÿ ðåñóðñîâ:
potgo.resource - ïîðò àíàëîãîâîãî äæîéñòèêà
ciaa.resource - 8520-a
ciab.resource - 8520-b
battclock.resource - ýíåðãîíåçàâèñèìûå ÷àñû/êàëåíäàðü
misc.resource - ïàðàëëåëüíûé è ïîñëåäîâàòåëüíûé ïîðòû
disk.resource - äèñêîâîä
battmem.resource - ýíåðãîíåçàâèñèìàÿ ïàìÿòü
card.resource - PCMCIA-ïîðò
Ðàáîòà ñ ðåñóðñàìè ïî ñóòè ïîõîæà íà ðàáîòó ñ áèáëèîòåêàìè:
êàæäûé ðåñóðñ ïðåäîñòàâëÿåò íåêîòîðûé íàáîð ôóíêöèé, ðàçãðàíè÷èâàþùèõ
äîñòóï ê «æåëåçó» ñî ñòîðîíû íåñêîëüêèõ çàäà÷, à òàêæå ïðåäîñòàâëÿþùèõ
èíòåðôåéñ ê ýòîìó «æåëåçó» (íàèáîëåå «íàâîðî÷åí» â ýòîì ïëàíå PCMCIA).
Îòëè÷èå îò áèáëèîòåê çàêëþ÷àåòñÿ â òîì, ÷òî ðåñóðñ íå òðåáóåò çàêðûòèÿ
è íå èìååò ñ÷¸ò÷èêà ïîëüçîâàòåëåé. Ïîëüçîâàòåëü ðåñóðñà ìîæåò áûòü
òîëüêî îäèí. Ðåñóðñ âñåãäà ïðèñóòñòâóåò â ïàìÿòè. Âûçîâ OpenResource()
ñ èìåíåì ðåñóðñà (A1) âîçâðàùàåò óêàçàòåëü íà ðåñóðñ, åñëè îí íàéäåí.
Âïîñëåäñòâèè ýòîò óêàçàòåëü èñïîëüçóåòñÿ êàê áàçà áèáëèîòåêè.
Ïîñëå îòêðûòèÿ ìîæíî âûçûâàòü ôóíêöèè ðåñóðñà. Òàê, äëÿ äîñòóïà
ê «æåëåçó» äèñêîâîäà (íàïðèìåð, äëÿ íàïèñàíèÿ çàìåíû èìåþùåãîñÿ
trackdisk.device) íóæíî âûïîëíèòü AllocUnit(), ïåðåäàâ åìó íîìåð
íóæíîãî äèñêîâîäà îò 0 äî 3 (D0), â ðåçóëüòàòå çàõâàòèâ îäèí èç
äîñòóïíûõ ÷åòûð¸õ äèñêîâîäîâ (âåðíóëñÿ íå íóëü) èëè óáåäèòüñÿ, ÷òî
ýòîò äèñêîâîä óæå êåì-òî çàíÿò (âåðíóëñÿ íóëü). Åñëè äèñêîâîä áûë
óñïåøíî çàõâà÷åí, ïî çàâåðøåíèè ðàáîòû ñ íèì íóæíî âûïîëíèòü
FreeUnit() c òåì æå àðãóìåíòîì.
Ðàáîòà ñ îñòàëüíûìè ðåñóðñàìè ïî ñóòè àíàëîãè÷íà.
Ðåñóðñû íå îáÿçàòåëüíî îïåðèðóþò «æåëåçîì». Òàê, patchcontrol
â ñîñòàâå ïàêåòà MCP äîáàâëÿåò â ñèñòåìó ðåñóðñ patch.resource,
ïîçâîëÿþùèé ðàçíîãî ðîäà ïàò÷àì, ïîääåðæèâàþùèì ýòîò èíòåðôåéñ,
óæèâàòüñÿ âìåñòå áåç êîíôëèêòîâ è ïîçâîëÿòü óáèðàòü ïàò÷è, êîòîðûå
áûëè íå ïîñëåäíèìè.
Ëþáàÿ çàäà÷à ìîæåò äîáàâèòü ñâîé ðåñóðñ ê ñïèñêó ñèñòåìíûõ
ðåñóðñîâ ôóíêöèåé Exec AddResource(). Îáðàòíàÿ îïåðàöèÿ âûïîëíÿåòñÿ
ñîîòâåòñòâåííî ôóíêöèåé RemResource().
18) Äåâàéñû
Äåâàéñ (device) - åù¸ îäèí «êèðïè÷èê». Äåâàéñû îáû÷íî âûïîëíÿþò
ôóíêöèþ äðàéâåðîâ ðàçëè÷íûõ óñòðîéñòâ, à òàêæå ïîääåðæêè ââîäà-âûâîäà
â ëþáîì âèäå.  îòëè÷èå îò áèáëèîòåê, èíòåðôåéñ äåâàéñîâ, âûïîëíÿþùèõ
ñõîäíóþ çàäà÷ó, ñòàíäàðòèçîâàí, è â ðåçóëüòàòå â ïðîãðàììå ìîæíî
ñäåëàòü âûáîð, êàêîé èç äåâàéñîâ îòêðûâàòü - à íàáîð îïåðàöèé â êàæäîì
èç íèõ èäåíòè÷åí.
Òàêèì îáðàçîì, â òåðìèíàëüíîé ïðîãðàììå ìîæíî âûáèðàòü íå òîëüêî
serial.device, íî è ëþáîé äðóãîé äåâàéñ îáñëóæèâàíèÿ ëþáîãî
ïîñëåäîâàòåëüíîãî ïîðòà (è äàæå íåîáÿçàòåëüíî ïîñëåäîâàòåëüíîãî - åñòü
äåâàéñ äëÿ îáñëóæèâàíèÿ ìîäåìà, âîòêíóòîãî â PCMCIA ïîðò). Äëÿ
äîñòóïà ê äèñêó ìîæíî âûáðàòü êàê scsi.device, òàê è trackdisk.device,
atapi.device...
Âûçîâ äåâàéñîâ âûïîëíÿåòñÿ ñîâåðøåííî èíûì îáðàçîì, íåæåëè
áèáëèîòåê (ïðàâäà, èç ýòîãî ïðàâèëà åñòü è èñêëþ÷åíèÿ). Âûçîâ äåâàéñà
íà íèçêîì óðîâíå ïðåäñòàâëÿåò ñîáîé îáìåí ñîîáùåíèÿìè. Íà áîëåå
âûñîêîì óðîâíå - ýòî âûïîëíåíèå ôóíêöèé Exec SendIO(), WaitIO(),
DoIO(), AbortIO(), CheckIO().
Òàê æå, êàê è áèáëèîòåêó, äåâàéñ ïåðåä ðàáîòîé ñ íèì íåîáõîäèìî
îòêðûòü, à ïî çàâåðøåíèè ðàáîòû - çàêðûòü.  îòëè÷èå îò áèáëèîòåêè,
äåâàéñó òðåáóåòñÿ ïåðåäà÷à íîìåðà óñòðîéñòâà - UNIT. Ýòî ïîçâîëÿåò
ðàáîòàòü ñ ëþáûì èç óñòðîéñòâ, ïîäêëþ÷åííûõ íà îäèí è òîò æå ïîðò.
Íîìåð âåðñèè äåâàéñó íå òðåáóåòñÿ.
Ïîñêîëüêó ðàáîòà ñ äåâàéñîì îñíîâàíà íà ñîîáùåíèÿõ, äëÿ íå¸ íóæåí
ReplyPort. Îí äîëæåí áûòü ñîçäàí çàðàíåå (ReplyPort()). Êðîìå òîãî,
íóæíà ñòðóêòóðà IORequest, êîòîðàÿ áóäåò äàëåå ïåðåäàâàòüñÿ âñÿêèé ðàç
ëþáîé îïåðàöèè ñ äåâàéñîì - ýòà ñòðóêòóðà ïðåäñòàâëÿåò ñîáîé ñîîáùåíèå
ñ ïîëüçîâàòåëüñêèìè äàííûìè. Ðàçìåð ñîîáùåíèÿ, ïåðåäàâàåìîãî äåâàéñó,
íå îãðàíè÷èâàåòñÿ ðàçìåðîì ýòîé ñòðóêòóðû.  çàâèñèìîñòè îò çàäà÷è
ïîñëå íå¸ óêàçûâàþòñÿ ïîëüçîâàòåëüñêèå äàííûå ðàçëè÷íîãî ðàçìåðà.
Ïåðåä îòêðûòèåì äåâàéñà IORequest óæå äîëæåí ñóùåñòâîâàòü.
Ñîçäà¸ò å¸ ôóíêöèÿ Exec CreateIORequest(), ïîëó÷àþùàÿ óêàçàòåëü íà
ReplyPort (A0) è ðàçìåð IORequest äëÿ äàííîãî ñëó÷àÿ (D0). Êîãäà
IORequest óæå ñîçäàí, ìîæíî îòêðûâàòü äåâàéñ - ýòî äåëàåòñÿ ôóíêöèåé
OpenDevice(), ïîëó÷àþùåé óêàçàòåëü íà IORequest. Àðãóìåíòàìè ñëóæàò
èìÿ äåâàéñà (A0), íîìåð óñòðîéñòâà (D0), IORequest (A1) è ôëàãè (D1).
Ôëàãè çàäàþò ðàçëè÷íûå ðåæèìû ðàáîòû äåâàéñà è çàâèñÿò îò êîíêðåòíîãî
äåâàéñà, ïî óìîë÷àíèþ - íóëü.
 îòëè÷èå îò áèáëèîòåêè, íóëü â ðåçóëüòàòå OpenDevice() îçíà÷àåò
óñïåøíîå îòêðûòèå äåâàéñà, à íåíóëåâîå çíà÷åíèå - îøèáêó.
Ðàçëè÷íûå îïåðàöèè ñ äåâàéñàìè âûïîëíÿþòñÿ ôóíêöèÿìè Exec. Ïåðåä
òåì, êàê âûïîëíèòü î÷åðåäíóþ îïåðàöèþ, íóæíî çàïîëíèòü ñîîòâåòñòâóþùèå
ïîëÿ ñòðóêòóðû IORequest. Ïîëå io_Command ñîäåðæèò êîä îïåðàöèè (îá
ýòîì íèæå), à io_Error áóäåò ñîäåðæàòü êîä îøèáêè ïî çàâåðøåíèè.
SendIO() çàïóñêàåò îïåðàöèþ, ïîëó÷àÿ óêàçàòåëü íà IORequest (A1).
Óïðàâëåíèå âûçâàâøåé ôóíêöèþ çàäà÷å áóäåò âîçâðàùåíî íåìåäëåííî, à
îïåðàöèÿ áóäåò âûïîëíÿòüñÿ àñèíõðîííî.
WaitIO() ïîçâîëÿåò ïîäîæäàòü äî çàâåðøåíèÿ îïåðàöèè, ïåðåâîäÿ
çàäà÷ó â ðåæèì îæèäàíèÿ, åñëè îïåðàöèÿ åù¸ íå çàâåðøåíà.
DoIO() ïðåäñòàâëÿåò ñîáîé SendIO() è WaitIO() «â îäíîì ôëàêîíå»,
âûïîëíÿÿ îïåðàöèþ è îòäàâàÿ óïðàâëåíèå òîëüêî ïî å¸ çàâåðøåíèè.
CheckIO() ïîçâîëÿåò ïðîâåðèòü, çàâåðøèëîñü ëè âûïîëíåíèå
îïåðàöèè, âîçâðàùàÿ FALSE, åñëè îïåðàöèÿ ïîêà ïðîäîëæàåòñÿ.
AbortIO() ïðåäíàçíà÷åíà äëÿ ïðåðûâàíèÿ âûïîëíÿþùåéñÿ îïåðàöèè.
AbortIO() íå óáèðàåò ñîîáùåíèå èç î÷åðåäè, Âû ïî-ïðåæíåìó äîëæíû
âûïîëíèòü WaitIO(). Íàçíà÷åíèå ýòîé ôóíêöèè - àâàðèéíîå çàâåðøåíèå
îïåðàöèè. Îíà ìîæåò âûïîëíèòüñÿ íåìåäëåííî, à ìîæåò íå âûïîëíèòüñÿ
âîîáùå - ýòî çàâèñèò îò äåâàéñà è òèïà îáñëóæèâàåìîãî óñòðîéñòâà.
Åñëè îïåðàöèÿ óæå çàâåðøåíà, AbortIO() íå äåëàåò íè÷åãî.
Ïî çàâåðøåíèè ðàáîòû ñ äåâàéñîì åãî íåîáõîäèìî çàêðûòü, âûïîëíèâ
CloseDevice() ñ åäèíñòâåííûì àðãóìåíòîì - IORequest (A1). Çàòåì
íåîáõîäèìî âûïîëíèòü DeleteIORequest() (A0) è DeleteMsgPort().
Ê ìîìåíòó çàêðûòèÿ äåâàéñà âñå îïåðàöèè ñ íèì äîëæíû áûòü çàâåðøåíû!
19) Îñíîâíûå îïåðàöèè ïî ðàáîòå ñ äåâàéñàìè
Äëÿ ëþáûõ ñóùåñòâóþùèõ äåâàéñîâ ñòàíäàðòèçèðîâàí îáùèé íàáîð
âûïîëíÿåìûõ èìè îïåðàöèé. Êàæäàÿ îïåðàöèÿ èìååò êîä, ïðåäñòàâëÿþùèé
ñîáîé êîíñòàíòó. Êîíêðåòíûé äåâàéñ ìîæåò êàê ðåàëèçîâàòü âåñü ýòîò
íàáîð, òàê è ÷àñòü íàáîðà. Ýòèìè îáùèìè äëÿ âñåõ äåâàéñîâ îïåðàöèÿìè
ÿâëÿþòñÿ:
CMD_INVALID
CMD_RESET
CMD_READ
CMD_WRITE
CMD_UPDATE
CMD_CLEAR
CMD_STOP
CMD_START
CMD_FLUSH
Êðîìå òîãî, îáùåé äëÿ âñåõ äåâàéñîâ ÿâëÿåòñÿ ñòðóêòóðà IORequest,
â ïîëå io_Command êîòîðîé êëàä¸òñÿ êîä îïåðàöèè.
Äåéñòâèå êàæäîé èç ýòèõ îïåðàöèé çàâèñèò îò êîíêðåòíîãî äåâàéñà.
CMD_WRITE äëÿ scsi.device âûïîëíÿåò çàïèñü íà äèñê, äëÿ serial.device
îòïðàâëÿåò äàííûå â ïîðò, à äëÿ cd.device íåäåéñòâèòåëüíà âîîáùå.
Ó êàæäîãî äåâàéñà, êðîìå ïåðå÷èñëåííûõ îïåðàöèé, ìîãóò áûòü åù¸ è
ñïåöèôè÷íûå äëÿ ýòîãî äåâàéñà îïåðàöèè. Îíè òîæå ÿâëÿþòñÿ êîíñòàíòàìè.
Êàæäûé äåâàéñ òàêæå ìîæåò èìåòü ðàñøèðåíèå ñòðóêòóðû IORequest -
èìåííî äëÿ ýòîãî ôóíöèè CreateIORequest() ïåðåäà¸òñÿ ðàçìåð ñòðóêòóðû.
 ÷àñòíîñòè, timer.device èñïîëüçóåò ñòðóêòóðó timerequest, ñîäåðæàùóþ
ïîìèìî IORequest ñïåöèôè÷íóþ äëÿ ðàáîòû ñî âðåìåíåì èíôîðìàöèþ.
Âûçîâ íå ñóùåñòâóþùåé ó äåâàéñà îïåðàöèè íå ôàòàëåí è ïðèâîäèò ê
âîçâðàòó äåâàéñîì îøèáêè IOERR_NOCMD.
Äëÿ äåâàéñîâ, îñóùåñòâëÿþùèõ ââîä-âûâîä, îáû÷íî èñïîëüçóåòñÿ
ñòðóêòóðà IOStdReq, ñîäåðæàùàÿ (êðîìå ïîëåé, èìåþùèõñÿ â IORequest)
óêàçàòåëü íà èíôîðìàöèîííûé ìàññèâ (io_Data), îáú¸ì ïåðåäàâàåìîé
èíôîðìàöèè â áàéòàõ (io_Length), ñìåùåíèå îò íà÷àëà áëî÷íîãî
óñòðîéñòâà â áàéòàõ (io_Offset) è ðåàëüíî ïåðåäàííûé îáú¸ì ïî
çàâåðøåíèè îïåðàöèè (io_Actual) - ñìîòðèòå exec/io.#?.
20) Ðàáîòà ñ áëî÷íûìè óñòðîéñòâàìè
Óñòðîéñòâà áëî÷íîãî äîñòóïà (block-oriented) - âèí÷åñòåðû,
äèñêîâîäû, CD-ROM, ìàãíèòîîïòèêà, ôëýø-êàðòû - îòëè÷àþòñÿ îò ïîòîêîâûõ
(stream) óñòðîéñòâ òåì, ÷òî ïðè ðàáîòå ñ íèìè àäðåñóåòñÿ òðåáóåìûé
âûïîëíÿåìîé îïåðàöèè ó÷àñòîê íîñèòåëÿ.
Óñòðîéñòâà áëî÷íîãî äîñòóïà ìîãóò èìåòü îáû÷íóþ äëÿ äèñêîâ
îðãàíèçàöèþ - äåëåíèå íà ñåêòîðà, ïîâåðõíîñòè è öèëèíäðû. Ìîãóò èìåòü
ðàçíûé ðàçìåð ñåêòîðà (ê ïðèìåðó, äëÿ âèí÷åñòåðà îáû÷íûé ðàçìåð
ñåêòîðà - 512 áàéò, à äëÿ CD-ROM - 2048 áàéò). Ìîãóò èìåòü ðàçíóþ
ãåîìåòðèþ - íàïðèìåð, ó âèí÷åñòåðîâ îáû÷íî òûñÿ÷è öèëèíäðîâ, à CD-ROM
ïðåäñòàâëÿåòñÿ îäíèì-åäèíñòâåííûì òðåêîì, ðàçáèòûì íà ñåêòîðà.
Ôëýø-êàðòû ìîãóò âîîáùå íå èìåòü áëî÷íîé ñòðóêòóðû. Äëÿ óíèôèêàöèè
äîñòóïà ê ëþáîìó áëî÷íîìó óñòðîéñòâó îíî àäðåñóåòñÿ ëèíåéíûì ñìåùåíèåì
â áàéòàõ (ïîëå io_Offset). Ñìåùåíèå äîëæíî áûòü êðàòíûì ðàçìåðó áëîêà!
Êëàññè÷åñêèì áëî÷íûì óñòðîéñòâîì ÿâëÿåòñÿ äèñêîâîä, îáñëóæèâàåìûé
trackdisk.device. Ýòîò äåâàéñ è ïîäîáíûå åìó äåâàéñû îáñëóæèâàþò
ñëåäóþùèé íàáîð êîìàíä:
CMD_CLEAR - ñáðîñ êýøà ïî ÷òåíèþ
 ñëó÷àå äèñêîâîäà ïðè ëþáîì îáðàùåíèè ê
äèñêåòå òðåê ñ÷èòûâàåòñÿ öåëèêîì, è ïîâòîðíîå
îáðàùåíèå ê òðåêó âûäà¸ò èìåþùèåñÿ â ïàìÿòè
äàííûå. Ýòà êîìàíäà äåëàåò èõ
íåäåéñòâèòåëüíûìè, è ïîâòîðíîå îáðàùåíèå ïî
÷òåíèþ âûçîâåò ïåðå÷èòûâàíèå òðåêà.
CMD_READ - ÷òåíèå
CMD_UPDATE - ñáðîñ êýøà ïî çàïèñè
Çàïèñü äàííûõ íà òðåê íå âûçûâàåò íåìåäëåííîãî
ñáðîñà íà äèñê. Òðåê çàïèñûâàåòñÿ öåëèêîì
òîëüêî ïðè íåîáõîäèìîñòè ïåðåõîäà íà äðóãîé
òðåê. Ýòà êîìàíäà âûçûâàåò çàïèñü «íàñèëüíî».
CMD_WRITE - çàïèñü
TD_ADDCHANGEINT - ðåãèñòðàöèÿ îáðàáîò÷èêà ñìåíû äèñêà
Ïîçâîëÿåò îïðåäåëèòü êîä, êîòîðûé áóäåò
âûïîëíÿòüñÿ â ñëó÷àå ñìåíû äèñêà.
TD_CHANGENUM - ñ÷èòûâàíèå ñ÷¸ò÷èêà ñìåí äèñêà
TD_CHANGESTATE - ïðîâåðêà íàëè÷èÿ äèñêà â ïðèâîäå
TD_EJECT - âûáðîñ äèñêà. Íà âñòðîåííîì äèñêîâîäå íå
ïîääåðæèâàåòñÿ. Ïðåäíàçíà÷åíà äëÿ CD-ROM etc.
TD_FORMAT - ôîðìàòèðîâàíèå òðåêà
TD_GETDRIVETYPE - îïðåäåëåíèå òèïà ïðèâîäà
Òèïû îïèñàíû â <devices/trackdisk.#?>
TD_GETGEOMETRY - ñ÷èòûâàíèå ãåîìåòðèè äèñêà
Ôîðìàò îïèñàí â <devices/trackdisk.#?>
TD_GETNUMTRACKS - ñ÷èòûâàíèå êîëè÷åñòâà öèëèíäðîâ
TD_MOTOR - óïðàâëåíèå ìîòîðîì
TD_PROTSTATUS - ïðîâåðêà íàëè÷èÿ çàùèòû çàïèñè
TD_RAWREAD - íèçêîóðîâíåâîå ÷òåíèå
TD_RAWWRITE - íèçêîóðîâíåâàÿ çàïèñü
Ïîñëåäíèå äâå êîìàíäû ïîçâîëÿþò ðàáîòàòü ñ
«÷óæèìè» ôîðìàòàìè - íàïðèìåð, ñ äèñêåòàìè IBM
PC.  ýòîì ñëó÷àå trackdisk.device âîçâðàùàåò
äîðîæêó âìåñòå ñî âñåìè ìàðêåðàìè, ñèíõðîáèòàìè
è ò.ï. â «ñûðîì» MFM-ôîðìàòå.
TD_REMCHANGEINT - îòìåíà ðåãèñòðàöèè TD_ADDCHANGEINT
TD_SEEK - ïîçèöèîíèðîâàíèå. Èñïîëüçóåòñÿ äëÿ ñëóæåáíûõ
öåëåé (÷èñòÿùèå äèñêè, äèàãíîñòèêà è ò.ä.)
Êàê óïîìèíàëîñü âûøå, êîíêðåòíûé äåâàéñ íå îáÿçàí îáñëóæèâàòü
âñå ïåðå÷èñëåííûå êîìàíäû. Åñëè êàêàÿ-òî êîìàíäà íå îáñëóæèâàåòñÿ,
âîçâðàùàåòñÿ îøèáêà. Áîëåå ïîäðîáíî ñìîòðèòå trackdisk.doc.
Ïîñêîëüêó ñìåùåíèå çàäà¸òñÿ 32-áèòíûì ÷èñëîì, âïîëíå î÷åâèäíûì
ñòàíîâèòñÿ îãðàíè÷åíèå íà îáú¸ì óñòðîéñòâà â ÷åòûðå ãèãàáàéòà. Äëÿ
ïðåîäîëåíèÿ ýòîãî îãðàíè÷åíèÿ âìåñòî ñòàíäàðòíûõ êîìàíä èñïîëüçóþòñÿ
èõ 64-áèòíûå ýêâèâàëåíòû:
NSCMD_TD_READ64
NSCMD_TD_WRITE64
NSCMD_TD_SEEK64
NSCMD_TD_FORMAT64
Ïðè ýòîì ñòàðøàÿ ïîëîâèíêà 64-áèòíîãî ñëîâà ïåðåä îïåðàöèåé
êëàä¸òñÿ â ïîëå io_Actual. Ýòè êîìàíäû ïîääåðæèâàþòñÿ òîëüêî íîâûìè
âåðñèÿìè äåâàéñîâ (ê ïðèìåðó, scsi.device v43 è ñòàðøå). Ïðîâåðÿéòå
ðåçóëüòàò èõ èñïîëüçîâàíèÿ - åñëè äåâàéñ âîçâðàòèë îøèáêó, çíà÷èò
ñëåäóåò èñïîëüçîâàòü 32-áèòíûå êîìàíäû, è îáú¸ì íîñèòåëÿ çàâåäîìî
ìåíüøå 4 ãèãàáàéò.
21) Ðàáîòà ñ ïîòîêîâûìè óñòðîéñòâàìè
Ïîòîêîâûå óñòðîéñòâà - íàïðèìåð, ïîñëåäîâàòåëüíûé ïîðò, â
îñíîâíîì óïðàâëÿþòñÿ ñòàíäàðòíûì íàáîðîì CMD-êîìàíä. Ê íèì
äîáàâëÿþòñÿ íåñêîëüêî êîìàíä è ïîëåé óïðàâëÿþùåé ñòðóêòóðû,
ñïåöèôè÷íûõ äëÿ óñòðîéñòâà. Òàê, äëÿ serial.device èñïîëüçóåòñÿ
ðàñøèðåííàÿ ñòðóêòóðà IOExtSer è äîñòóïíû êîìàíäû:
SDCMD_BREAK - ïîñûëêà ñèãíàëà BREAK
SDCMD_QUERY - ñ÷èòûâàíèå ñîñòîÿíèÿ ïîðòà
Ïîçâîëÿåò îïðåäåëèòü ñîñòîÿíèå ñèãíàëîâ
RTS/CTS, DTR/DSR, CD, RI, ñèãíàë BREAK,
ïåðåïîëíåíèå áóôåðà.
SDCMD_SETPARAMS - óñòàíîâêà ñîñòîÿíèÿ ïîðòà
Óñòàíàâëèâàåòñÿ ðàçìåð áóôåðà, ñêîðîñòü ïîðòà,
äëèòåëüíîñòü ñèãíàëà BREAK, ôîðìàò ïîñûëêè,
xON/xOFF ðåæèì è ïðî÷åå.
Ïðî÷èå äåâàéñû, ðàáîòàþùèå ñ ïîñëåäîâàòåëüíûìè ïîðòàìè, ìîãóò êàê
ïîääåðæèâàòü, òàê è íå ïîääåðæèâàòü ýòè êîìàíäû è ðåæèìû. Òàê,
íàïðèìåð, 8n1.device èìååò åäèíñòâåííûé ôîðìàò ïîñûëêè (÷òî ñëåäóåò èç
íàçâàíèÿ) è íå ïîçâîëÿåò åãî ìåíÿòü.
parallel.device èñïîëüçóåò ñòðóêòóðó IOExtPar è ñâîé íàáîð êîìàíä
- ñìîòðèòå parallel.doc è <devices/parallel.#?>
Îñòàëüíûå òèïû äåâàéñîâ ðàññìàòðèâàòüñÿ íå áóäóò - ÷èòàéòå
äîêóìåíòàöèþ ñàìîñòîÿòåëüíî.
22) Ðàáîòà ñ äåâàéñàìè ïîñðåäñòâîì âûçîâà ôóíêöèé
Ïîñûëêà êîìàíä íå ÿâëÿåòñÿ åäèíñòâåííûì ñðåäñòâîì ðàáîòû ñ
äåâàéñàìè. Äëÿ îñóùåñòâëåíèÿ áûñòðîãî âûïîëíåíèÿ îïåðàöèé, áåç
ðàñõîäà âðåìåíè íà ïåðåñûëêó ñîîáùåíèé, ïðèìåíÿþòñÿ ôóíêöèè,
àíàëîãè÷íûå ôóíêöèÿì áèáëèîòåê. Íàáîð ýòèõ ôóíêöèé ñïåöèôè÷åí
äëÿ êàæäîãî äåâàéñà.
Ïîñêîëüêó OpenDevice() íå âîçâðàùàåò «áàçó» äåâàéñà, ïîñëå
îòêðûòèÿ äåâàéñà áàçó íóæíî ïðî÷èòàòü èç ñòðóêòóðû IORequest.
Íàõîäèòñÿ îíà â ïîëå io_Device ýòîé ñòðóêòóðû. Êîãäà äåâàéñ óñïåøíî
îòêðûò, áàçà êîïèðóåòñÿ â ïåðåìåííóþ, ñïåöèôè÷íóþ äëÿ äåâàéñà -
íàïðèìåð, äëÿ timer.device ýòî áóäåò ïåðåìåííàÿ TimerBase.
Ïîñëå ýòîãî ìîæíî âûïîëíÿòü ôóíêöèè äåâàéñà. Êàêèå ôóíêöèè êàêîé
äåâàéñ ïðåäîñòàâëÿåò, îïèñàíî â äîêóìåíòàöèè ïî äåâàéñàì.
23) Quick IO
Êðîìå ñòàíäàðòíûõ îïåðàöèé ââîäà-âûâîäà, ñóùåñòâóåò òàêæå áûñòðûé
ââîä-âûâîä, ïðè êîòîðîì íå âûïîëíÿåòñÿ ïåðåñûëîê ñîîáùåíèé è ñðàçó
íàïðÿìóþ âûçûâàåòñÿ êîä äåâàéñà. Ê ïðèìåðó, òàêîé ïîäõîä ïîëåçåí äëÿ
serial.device, êîãäà ïðèíèìàåìàÿ èíôîðìàöèÿ óæå ëåæèò â áóôåðå, è å¸
íóæíî òîëüêî ïåðåäàòü çàäà÷å.
Ìåõàíèçì áûñòðîãî àñèíõðîííîãî ââîäà-âûâîäà ðåàëèçóåòñÿ ñëåäóþùèì
îáðàçîì: â ïîëå io_Flags ñòðóêòóðû IORequest íóæíî óñòàíîâèòü ôëàã
IO_QUICK. Çàòåì âìåñòî ñòàíäàðòíîãî SendIO() (î÷èùàþùåãî ýòî ïîëå)
íóæíî âûçâàòü ôóíêöèþ BeginIO() äåâàéñà. Ïîñëå âûçîâà íóæíî ïðîâåðèòü
ôëàã IO_QUICK: åñëè ôëàã îñòàëñÿ óñòàíîâëåííûì, çíà÷èò îïåðàöèÿ óæå
çàâåðøåíà, è WaitIO() âûïîëíÿòü íå íóæíî. Åñëè IO_QUICK ñáðîøåí,
çíà÷èò, îïåðàöèÿ íå ìîæåò áûòü çàâåðøåíà ñðàçó, è íóæíî îæèäàòü å¸
çàâåðøåíèÿ ñ ïîìîùüþ WaitIO().
Ñ òî÷êè çðåíèÿ ïðîãðàììèñòà íà àññåìáëåðå, BeginIO() - ýòî âûçîâ
jsr -36(a0) - êàê îáû÷íî, â A6 äîëæíà ëåæàòü áàçà. Ïîñêîëüêó ýòà
îïåðàöèÿ â ïðèíöèïå ìîæåò âûïîëíÿòüñÿ ñ ëþáûìè äåâàéñàìè, èìÿ áàçû íå
îïðåäåëåíî. ×òîáû îáîéòè ýòîò ìîìåíò ïðè ïðîãðàììèðîâàíèè íà Ñè,
ïðèìåíÿåòñÿ ôóíêöèÿ BeginIO() ëèíêóåìîé áèáëèîòåêè amiga.lib,
âûçûâàþùàÿñÿ àíàëîãè÷íî ôóíêöèè SendIO() - êîòîðàÿ íå ìîæåò áûòü
ïðèìåíåíà äëÿ áûñòðîãî ââîäà-âûâîäà.
Áûñòðûé ñèíõðîííûé ââîä-âûâîä äåëàåòñÿ ñ ïîìîùüþ óæå èçâåñòíîé
íàì DoIO(), ñ ïðåäâàðèòåëüíîé óñòàíîâêîé ôëàãà IO_QUICK.
24) Ðàáîòà ñ òàéìåðîì
Íåñêîëüêî îñîáíÿêîì ñðåäè äåâàéñîâ ñòîèò timer.device - îí íå
ÿâëÿåòñÿ ñðåäñòâîì ââîäà-âûâîäà. Òàéìåð îïåðèðóåò ñâîé ñòðóêòóðîé
timerequest, èìååò ñâîè êîìàíäû, à òàêæå íàáîð ôóíêöèé. Îòëè÷àåòñÿ îò
îáùåïðèíÿòîãî è ïðèìåíåíèå UNITîâ - ýòî íå «íîìåð óñòðîéñòâà», à
ðåæèì, â êîòîðîì ìû áóäåì èñïîëüçîâàòü òàéìåð.
Òàéìåð óìååò ñ÷èòàòü âðåìÿ â äâóõ ðàçíûõ ñèñòåìàõ åäèíèö. Ïåðâàÿ
ñèñòåìà îáùåïðèíÿòà - ýòî ñåêóíäû è ìèêðîñåêóíäû. Îíè õðàíÿòñÿ â
ñòðóêòóðå timeval è ïðåäñòàâëÿþò ñîáîé äâà ëîíãà. Ïðåäñòàâëåíèå
âðåìåíè âñåãäà íîðìàëèçîâàíî - ò.å., êîëè÷åñòâî ìèêðîñåêóíä íèêîãäà íå
ïðåâûøàåò ìèëëèîíà.
Âòîðàÿ ñèñòåìà - òàê íàçûâàåìûå EClock. Ýòî âíóòðåííÿÿ åäèíèöà
âðåìåíè Àìèãè. ×àñòîòà EClock çàâèñèò îò ìîäåëè êîìïüþòåðà è îáû÷íî
ñîñòàâëÿåò ïîðÿäêà 7 ìåãàãåðö. EClock õðàíÿòñÿ â ñòðóêòóðå EClockVal,
ñîñòîÿùåé èç äâóõ ëîíãîâ - 64-áèòíîãî ïðåäñòàâëåíèÿ ÷èñëà.
Òàéìåð èìååò äâà ýòàëîíà âðåìåíè - ñîáñòâåííî EClock (òî÷íîñòü
îïðåäåëÿåòñÿ ÷àñòîòîé EClock) è êàäðîâóþ ÷àñòîòó äèñïëåÿ (òî÷íîñòü
çàâèñèò îò ÷àñòîòû, îáû÷íî â ïðåäåëàõ 50-100Hz). Âòîðîé âàðèàíò
èñïîëüçóåòñÿ òîãäà, êîãäà òî÷íîñòü íå èãðàåò îñîáîé ðîëè - íàïðèìåð,
äëÿ ìèãàíèÿ êóðñîðà. Ýòàëîí âðåìåíè íå èìååò îòíîøåíèÿ ê ñèñòåìå
åäèíèö - ìîæíî îïðåäåëÿòü âðåìÿ â ìèêðîñåêóíäàõ, èñïîëüçóÿ EClock.
È íàêîíåö, òàéìåð èìååò äâà ðàçíûõ ðåæèìà ðàáîòû. Îí óìååò êàê
îïåðèðîâàòü èíòåðâàëàìè âðåìåíè, òàê è ïîçâîëÿåò îæèäàòü íàñòóïëåíèÿ
îïðåäåë¸ííîãî âðåìåíè.
Äëÿ òîãî, ÷òîáû èñïîëüçîâàòü ïðåäîñòàâëÿåìûå âîçìîæíîñòè, ïðè
îòêðûòèè timer.device íóæíî óêàçàòü Unit:
UNIT_MICROHZ - ðàáîòà ñ èíòåðâàëàìè âðåìåíè â ìèêðîñåêóíäàõ,
èñïîëüçóÿ â êà÷åñòâå ýòàëîíà EClock.
UNIT_ECLOCK - ðàáîòà ñ èíòåðâàëàìè âðåìåíè â åäèíèöàõ EClock
(ýòàëîí - ðàçóìååòñÿ, EClock)
UNIT_VBLANK - èíòåðâàëû âðåìåíè â ìèêðîñåêóíäàõ, ýòàëîí -
êàäðîâàÿ ÷àñòîòà
UNIT_WAITUNTIL - îæèäàíèå íàñòóïëåíèÿ çàäàííîãî âðåìåíè â
ìèêðîñåêóíäàõ, ýòàëîí - êàäðîâàÿ ÷àñòîòà
UNIT_WAITECLOCK - îæèäàíèå íàñòóïëåíèÿ âðåìåíè â EClock,
ýòàëîí - EClock
Ðàáîòà ñ timer.device îñóùåñòâëÿåòñÿ îïåðàöèåé TR_ADDREQUEST.
Åñëè òðåáóåòñÿ òîëüêî îæèäàíèå â òå÷åíèå íåêîòîðîãî èíòåðâàëà âðåìåíè
ñ ìàëîé òî÷íîñòüþ, âìåñòî âîçíè ñ òàéìåðîì ìîæíî èñïîëüçîâàòü ôóíêöèþ
dos.library Delay(), àðãóìåíòîì (D1) èìåþùóþ èíòåðâàë â «òèêàõ» (1/50
ñåêóíäû). Íåîáõîäèìóþ ðàáîòó ñ òàéìåðîì ýòà ôóíêöèÿ âûïîëíèò ñàìà.
Òàéìåð èìååò ðÿä âñïîìîãàòåëüíûõ ôóíêöèé äëÿ ðàáîòû ñ âðåìåíåì.
AddTime(), SubTime() è CmpTime() ïîëó÷àþò óêàçàòåëè íà èñõîäíóþ (A1) è
êîíå÷íóþ (A0) ñòðóêòóðó timeval è ïîçâîëÿþò ñêëàäûâàòü, âû÷èòàòü è
ñðàâíèâàòü âðåìÿ, ïîïóòíî îñóùåñòâëÿÿ íîðìàëèçàöèþ.
Ôóíêöèÿ GetSysTime() âîçâðàùàåò â ñòðóêòóðå timeval, óêàçàòåëü íà
êîòîðóþ áûë åé ïåðåäàí (A0), òåêóùåå ñèñòåìíîå âðåìÿ. Ôóíêöèÿ
ReadEClock() àíàëîãè÷íûì îáðàçîì çàïîëíÿåò ñòðóêòóðó EClockVal (A0) â
ôîðìàòå EClock, è âîçâðàùàåò (D0) ñèñòåìíóþ ÷àñòîòó EClock â ãåðöàõ.
Êðîìå òîãî, äîñòóïíû êîìàíäû TR_GETSYSTIME è TR_SETSYSTIME äëÿ
ñ÷èòûâàíèÿ è óñòàíîâêè ñèñòåìíîãî âðåìåíè ñîîòâåòñòâåííî.
25) Íåêîòîðûå îñîáåííîñòè èñïîëüçîâàíèÿ äåâàéñîâ
Êàê è âñ¸ ïðî÷åå, ðàáîòà ñ äåâàéñàìè îðãàíèçîâàíà íà ñèãíàëàõ è
ñîîáùåíèÿõ. Ýòî ïîçâîëÿåò îæèäàòü çàâåðøåíèÿ íåñêîëüêèõ çàïðîñîâ.
Î÷åâèäíî, íè÷òî íå ìåøàåò è îæèäàòü îäíîâðåìåííî êàê çàâåðøåíèÿ
ââîäà-âûâîäà, òàê è ëþáûõ äðóãèõ ñîîáùåíèé è ñèãíàëîâ. Äëÿ ýòîãî
ïðèìåíÿéòå òîò æå ñïîñîá, ÷òî áûë îïèñàí ðàíåå äëÿ ïîðòîâ, èñïîëüçóÿ
ReplyPort.
Ñóùåñòâîâàíèå àñèíõðîííîé ðàáîòû ñ äåâàéñîì íàòàëêèâàåò íà ìûñëü
î âîçìîæíîñòè ïîñûëêè ñðàçó íåñêîëüêèõ çàïðîñîâ åäèíîæäû îòêðûòîìó
äåâàéñó. Îäíàêî, èñïîëüçîâàòü îäèí è òîò æå IORequest äëÿ ýòîãî
íåëüçÿ - ñòðóêòóðà äîëæíà áûòü íåèçìåííîé äî òåõ ïîð, ïîêà äåâàéñ íå
çàâåðøèò îïåðàöèþ. ×òîáû íå îòêðûâàòü äëÿ ýòîãî äåâàéñ íåñêîëüêî ðàç,
èñïîëüçóåòñÿ ñëåäóþùèé «òðþê»: ñîçäàþòñÿ íîâûå ñòðóêòóðû IORequest
ïóò¸ì êîïèðîâàíèÿ â íèõ ñòàðîé. Êàê óæå óïîìèíàëîñü, ïåðåä çàêðûòèåì
äåâàéñà âñå çàïðîñû äîëæíû áûòü çàâåðøåíû.
26) New Style Devices
Ïîñêîëüêó ñóùåñòâóåò íåñêîëüêî ðàçíûõ òèïîâ äåâàéñîâ, ñîâìåñòèìûõ
ñ ñîáîé òîëüêî íà óðîâíå ñòàíäàðòíûõ CMD-êîìàíä, áûëà áû ïîëåçíîé
âîçìîæíîñòü îïðåäåëèòü òèï äåâàéñà ïîñëå îòêðûòèÿ - íàïðèìåð, ÷òîáû
òåðìèíàëüíàÿ ïðîãðàììà íå âçäóìàëà âìåñòî serial.device èñïîëüçîâàòü
scsi.device. Òàêàÿ âîçìîæíîñòü ïîÿâèëàñü áëàãîäàðÿ ñïåöèôèêàöèè NSD,
ïðèíÿòîé â 1996 ãîäó Amiga International.
New Style Devices ïðè âûïîëíåíèè êîìàíäû NSCMD_DEVICEQUERY
âîçâðàùàþò ñïåöèôèêàöèþ äåâàéñà â ñòðóêòóðå NSDeviceQueryResult.
Óêàçàòåëü íà ýòó ñòðóêòóðó è å¸ ðàçìåð äîëæíû áûòü ïðåäâàðèòåëüíî
óêàçàíû â io_Data è io_Length.
Ñòðóêòóðà ñîäåðæèò ñëåäóþùèå ïîëÿ:
DevQueryFormat - ïåðåä îïåðàöåé íóæíî îáíóëèòü
SizeAvailable - ïåðåä îïåðàöåé íóæíî îáíóëèòü
DeviceType - òèï äåâàéñà
DeviceSubType - ïîäòèï, â çàâèñèìîñòè îò òèïà
Çàðåçåðâèðîâàí äëÿ áóäóùåãî èñïîëüçîâàíèÿ,
â äàííûé ìîìåíò âñåãäà íóëåâîé
SupportedCommands - óêàçàòåëü íà ìàññèâ 16-áèòíûõ ñëîâ,
îêàí÷èâàþùèõñÿ íóë¸ì - ñïèñîê âñåõ êîìàíä,
íå âûçûâàþùèõ îøèáêó IOERR_NOCMD.
Ïîñëåäíåå ïîëå èçáàâëÿåò ïðîãðàììèñòà îò íåîáõîäèìîñòè ìåòîäîì
òûêà âûÿñíÿòü, ðàáîòàåò ëè òà èëè èíàÿ êîìàíäà, èëè íåò.
 íàñòîÿùèé ìîìåíò îïðåäåë¸í ñëåäóþùèé íàáîð òèïîâ äåâàéñîâ:
<devices/newstyle.#?>
NSDEVTYPE_GAMEPORT
NSDEVTYPE_TIMER
NSDEVTYPE_KEYBOARD
NSDEVTYPE_INPUT
NSDEVTYPE_TRACKDISK
NSDEVTYPE_CONSOLE
NSDEVTYPE_SANA2
NSDEVTYPE_AUDIO
NSDEVTYPE_CLIPBOARD
NSDEVTYPE_PRINTER
NSDEVTYPE_SERIAL
NSDEVTYPE_PARALLEL
NSDEVTYPE_UNKNOWN
Êàòåãîðèÿ äåâàéñà ïîíÿòíà èç íàçâàíèÿ òèïà. NSDEVTYPE_UNKNOWN
îçíà÷àåò äåâàéñ, íå ïîäïàäàþùèé íè ïîä îäíó èç ýòèõ êàòåãîðèé.
Î÷åâèäíî, îïèñàííîå ðàñøèðåíèå ïîääåðæèâàåòñÿ òîëüêî äåâàéñàìè,
ñîçäàííûìè ïîñëå âûõîäà ýòîé ñïåöèôèêàöèè. Åñëè êàêîé-òî êîíêðåòíûé
äåâàéñ ñëèøêîì ñòàð èëè ïî êàêîé-òî åù¸ ïðè÷èíå íå ïîääåðæèâàåò å¸,
ñëåäóåò ïîëüçîâàòüñÿ òîëüêî èìåþùèìèñÿ âîçìîæíîñòÿìè, âîçëîæèâ
îòâåòñòâåííîñòü çà ïðàâèëüíîñòü âûáîðà òèïà äåâàéñà íà ïîëüçîâàòåëÿ.
27) Ðàáîòà ñ äàòàìè
Ñèñòåìíîå âðåìÿ ïðåäñòàâëÿåò ñîáîé êîëè÷åñòâî âðåìåíè, ïðîøåäøåå
ñ äàòû 1 ÿíâàðÿ 1978 ãîäà. Ïîñêîëüêó äëÿ ÷åëîâåêà ýòî âðåìÿ íè÷åãî íå
ñêàæåò, ñóùåñòâóþò ôóíêöèè, îïåðèðóþùèå ñ áîëåå ïðèâû÷íûì äëÿ âñåõ íàñ
ïðåäñòàâëåíèåì âðåìåíè.
Ôóíêöèÿ DateStamp() dos.library çàïîëíÿåò ñòðóêòóðó DateStamp
<dos/dos.#?>, óêàçàòåëü íà êîòîðóþ åé ïåðåäàí (D1). Ñòðóêòóðà
ñîäåðæèò öåëîå êîëè÷åñòâî äíåé, ïðîøåäøèõ ñ óïîìÿíóòîé äàòû (ds_Days),
êîëè÷åñòâî ìèíóò, ïðîøåäøèõ ñ ïîëóíî÷è (ds_Minute), è êîëè÷åñòâî
«òèêîâ» ïîñëåäíåé ìèíóòû (ds_Tick).
Ôóíêöèÿ CompareDates() ïîçâîëÿåò ñðàâíèòü äâå äàòû (D1,D2),
ïðåäñòàâëåííûå ñòðóêòóðàìè DateStamp.
Ôóíêöèè DateToStr() è StrToDate() ïåðåâîäÿò äàòó èç DateStamp â
ïðèâû÷íîå ÷åëîâå÷åñêîå ïðåäñòàâëåíèå è îáðàòíî. Äëÿ ýòîãî
èñïîëüçóåòñÿ ñòðóêòóðà <dos/datetime.#?> DateTime
(D1), ñîäåðæàùàÿ â íà÷àëå ñòðóêòóðó DateStamp è äîïîëíèòåëüíî èìåþùàÿ
ðÿä ïîëåé, óïðàâëÿþùèõ ôîðìàòîì, ïîäñòàíîâêîé ñëîâ (íàçâàíèÿ äíåé
íåäåëè) è èìåþùàÿ óêàçàòåëè íà ðåçóëüòèðóþùèå ñòðîêè, êîòîðûå íóæíî
çàïîëíèòü çàðàíåå ïåðåä âûçîâîì ôóíêöèè. Ïîäðîáíåå ñìîòðèòå dos.doc.
Äðóãîå ñðåäñòâî - Date2Amiga() è Amiga2Date() â utility.library
ïîçâîëÿåò îïåðèðîâàòü íå òåêñòîâûìè ñòðîêàìè, à öèôðîâûì
ïðåäñòàâëåíèåì äàòû. Ôóíêöèè ïðåîáðàçóþò êîëè÷åñòâî ñåêóíä (D0) â
ñòðóêòóðó (A0) ClockData <utility/date.#?> è îáðàòíî. Ñòðóêòóðà
ñîäåðæèò ñëåäóþùèå ïîëÿ:
sec - ñåêóíäû
min - ìèíóòû
hour - ÷àñû
mday - äåíü ìåñÿöà
month - ìåñÿö
year - ãîä
wday - äåíü íåäåëè
28) DOS
Äàëåå ïîéä¸ò ïîäðîáíîå îïèñàíèå ðàáîòû ñ dos.library (äàëåå
ïðîñòî DOS). Ýòà áèáëèîòåêà çàíèìàåòñÿ ââîäîì-âûâîäîì íà áîëåå
âûñîêîì óðîâíå, ðàáîòîé ñ ôàéëàìè, ôàéëîâûìè ñèñòåìàìè è ïðî÷èì.
DOS ââîäèò íîâîå ïîíÿòèå ÏÐÎÖÅÑÑ. Ïðîöåññ - ýòî çàäà÷à (task),
èìåþùàÿ ðàñøèðåííûå ñëóæåáíûå ïîëÿ. Ïðîöåññ îïèñûâàåòñÿ ñòðóêòóðîé
Process, êîòîðàÿ ïåðâûì ýëåìåíòîì ñîäåðæèò ñòðóêòóðó Task. Íîâûå ïîëÿ
ñòðóêòóðû íåîáõîäèìû äëÿ ðàáîòû ñ DOS. Òîëüêî ïðîöåññû èìåþò ïðàâî
âûçûâàòü áîëüøèíñòâî ôóíêöèé dos.library. Âïðî÷åì, áîëüøèíñòâî çàäà÷,
êîòîðûå «êðóòÿòñÿ» â ñèñòåìå, ïðåäñòàâëÿþò ñîáîé èìåííî ïðîöåññû.
Îïèñàííîé ðàíåå ôóíêöèåé CreateNewProc() ñîçäà¸òñÿ èìåííî ïðîöåññ.
Ïî èñòîðè÷åñêèì ïðè÷èíàì DOS èìååò ñëåäóþùóþ îñîáåííîñòü:
àðãóìåíòû áîëüøèíñòâà ôóíêöèé ïåðåäàþòñÿ â ðåãèñòðàõ äàííûõ. Òàê
ïîëó÷èëîñü â ðåçóëüòàòå òîãî, ÷òî ïåðâûå âåðñèè DOS áûëè íàïèñàíû íå
íà Asm/C, à íà ÿçûêå BCPL. Ïî òîé æå ïðè÷èíå â DOS äîñòàòî÷íî ÷àñòî
âñòðå÷àþòñÿ òàê íàçûâàåìûå BCPL-óêàçàòåëè, êîòîðûå ïðåäñòàâëÿþò ñîáîé
íîìåð ëîíãà (òî åñòü, äëÿ ïðåîáðàçîâàíèÿ â îáû÷íûé óêàçàòåëü íóæíî
ñäâèíóòü åãî âëåâî íà äâà ðàçðÿäà).
29) Óñòðîéñòâà è ïóòè
DOS àäðåñóåò óñòðîéñòâà ïî èõ èìåíàì. Èìÿ - òåêñòîâàÿ ñòðîêà ñ
äâîåòî÷èåì â êîíöå. Óñòðîéñòâîì ìîæåò áûòü âñ¸ ÷òî óãîäíî - äèñêåòà,
ïîñëåäîâàòåëüíûé ïîðò, êîíñîëüíîå îêíî.
×àñòíûì ñëó÷àåì óñòðîéñòâà ìîæåò áûòü èåðàðõè÷åñêàÿ äðåâîâèäíàÿ
ñòðóêòóðà, ñîäåðæàùàÿ ìíîæåñòâî ôàéëîâ. Äëÿ âûÿñíåíèÿ, ÿâëÿåòñÿ ëè
äàííîå óñòðîéñòâî ôàéëîâûì, ñóùåñòâóåò ôóíêöèÿ IsFileSystem(), êîòîðîé
ïåðåäà¸òñÿ èìÿ óñòðîéñòâà (D1). Ðåçóëüòàò - TRUE äëÿ ôàéëîâîé ñèñòåìû
èëè FALSE â ïðîòèâíîì ñëó÷àå.
Äëÿ àäðåñàöèè ôàéëà â ïðåäåëàõ èåðàðõè÷åñêîé ôàéëîâîé ñèñòåìû
ñóùåñòâóþò ïóòè. Ïóòü ìîæåò áûòü îòíîñèòåëüíûì èëè àáñîëþòíûì.
Ïîäðîáíî îá ýòîì ÷èòàéòå â êíèãå Ä.Ìèõàéëîâà.
Äëÿ óäîáñòâà ðàáîòû ñ ïóòÿìè DOS ïðåäîñòàâëÿåò ðÿä ôóíêöèé:
AddPart() äîáàâëÿåò èìÿ ôàéëà èëè ïóòü, çàäàííûé âòîðûì
àðãóìåíòîì (D2), ê ïóòè â áóôåðå (D1) îïðåäåë¸ííîãî ðàçìåðà (D3).
Åñëè äîáàâëÿåìûé ïóòü ÿâëÿåòñÿ àáñîëþòíûì, îí ïîëíîñòüþ çàìåùàåò
èñõîäíûé. Ïîäðîáíåå ÷èòàéòå dos.doc.
FilePart() èùåò ïîñëåäíèé êîìïîíåíò ïóòè.
PathPart() íàõîäèò êîíåö ïðåäïîñëåäíåãî êîìïîíåíòà ïóòè, îáû÷íî -
èìåíè äèðåêòîðèè.
30) Ìåõàíèçì çàïóñêà ïðîãðàìì â DOS
 AmigaOS ñóùåñòâóåò îáùåïðèíÿòûé ôîðìàò çàãðóæàåìîãî ôàéëà.
Îí èñïîëüçóåòñÿ íå òîëüêî äëÿ èñïîëíÿåìûõ ôàéëîâ - â ýòîì æå ôîðìàòå
õðàíÿòñÿ è áèáëèîòåêè, è äåâàéñû, è øðèôòû, è èêîíêè. Ôàéë ñîñòîèò èç
ÕÀÍÊΠ(HUNKS), ïðåäñòàâëÿþùèõ ñîáîé îòäåëüíûå ó÷àñòêè. Õàíêè ìîãóò
ñîäåðæàòü êîä, äàííûå, îòëàäî÷íóþ èíôîðìàöèþ, è òàáëèöû ïåðåìåùåíèÿ.
Ìåõàíèçì òàáëèö ïåðåìåùåíèÿ ïîçâîëÿåò çàãðóæàòü íåïåðåìåùàåìûå
ïðîãðàììû â ëþáûå àäðåñà ïàìÿòè, ìîäèôèöèðóÿ â íèõ ÿ÷åéêè, çàâèñÿùèå
îò àäðåñîâ - òàáëèöû ïåðåìåùåíèÿ ñîäåðæàò ñïèñîê ýòèõ ÿ÷ååê.
Ðàçìåùåíèå çàãðóæàåìîãî ôàéëà â ïàìÿòè âûïîëíÿåòñÿ ôóíêöèåé
LoadSeg(). Åé ïåðåäà¸òñÿ óêàçàòåëü íà ñòðîêó - èìÿ ôàéëà (D1).
Ðåçóëüòàò LoadSeg() - BCPL-óêàçàòåëü íà òàê íàçûâàåìûé seglist.
Seglist (ñïèñîê ñåãìåíòîâ-õàíêîâ) ñîäåðæèò â ïåðâîì ëîíãå êàæäîãî
ñåãìåíòà BCPL-óêàçàòåëü íà ñëåäóþùèé ñåãìåíò. Êîíåö ñïèñêà - íóëü.
LoadSeg() àâòîìàòè÷åñêè âûïîëíÿåò ïåðåìåùåíèå, ïîñëå å¸ óñïåøíîãî
âûïîëíåíèÿ çàãðóæàåìûé ôàéë ãîòîâ ê âûïîëíåíèþ.
Êîãäà çàãðóæåííûé ôàéë â ïàìÿòè áîëåå íå íóæåí, âûïîëíÿåòñÿ
UnLoadSeg(), îñâîáîæäàþùèé çàíÿòóþ èì ïàìÿòü.
Çàïóñê ïðîãðàììû DOS-îì ïðîèçâîäèòñÿ îïåðàöèåé jsr. Ïðè ýòîì â
A0 ïðîãðàììå ïåðåäà¸òñÿ óêàçàòåëü íà êîìàíäíóþ ñòðîêó, à â D0 äëèíà.
Ñòðîêà îêàí÷èâàåòñÿ ñèìâîëîì LF. Ñòðîêà ÍÅ ÑÎÄÅÐÆÈÒ èìÿ ïðîãðàììû,
òî åñòü íà÷èíàåòñÿ ñ ïåðâîãî æå å¸ àðãóìåíòà (èëè ñîäåðæèò òîëüêî LF,
åñëè àðãóìåíòîâ íåò).
Ðåçóëüòàò ðàáîòû (returncode) ïðîãðàììà âîçâðàùàåò â D0. Íóëü
îçíà÷àåò óñïåøíîå (áåç îøèáîê) çàâåðøåíèå ïðîãðàììû.
ÂÀÆÍÎÅ ÇÀÌÅ×ÀÍÈÅ. Workbench èñïîëüçóåò äðóãîé ìåõàíèçì ïåðåäà÷è
àðãóìåíòîâ! Ïðèçíàêîì çàïóñêà ïðîãðàììû èç DOS ÿâëÿåòñÿ íåíóëåâîå
ïîëå óêàçàòåëÿ íà ñòðóêòóðó CommandLineInterface â ñòðóêòóðå Process.
Ïðîâåðèòü ýòî ïîëå ìîæíî êàê «íàïðÿìóþ», âûïîëíèâ FindTask() ñ
íóëåâûì àðãóìåíòîì, òàê è ïî ðåçóëüòàòó Cli(), åñëè DOS îòêðûò.
31) Çàïóñê è îñòàíîâ ïðîãðàììû
×òîáû çàïóñòèòü èç âàøåé ïðîãðàììû êàêóþ-òî åù¸, î÷åâèäíî, ìîæíî
ñàìîñòîÿòåëüíî âûïîëíèòü LoadSeg() è ïåðåäàòü åé óïðàâëåíèå.
Íî ñóùåñòâóåò è áîëåå ïðîñòîé ñïîñîá çàïóñêà äðóãîé ïðîãðàììû -
SystemTags(). Àðãóìåíò - êîìàíäíàÿ ñòðîêà (D1) è taglist (D2). Ïðè
âûïîëíåíèè ýòîé ôóíêöèè çàïóñêàåòñÿ òðåáóåìàÿ ïðîãðàììà, à ïî âûõîäó
èç íå¸ ôóíêöèÿ âîçâðàùàåò returncode.
Òýãè, ïåðåäàâàåìûå ôóíêöèè, ïîçâîëÿþò ïåðåíàïðàâèòü å¸ ââîä è
âûâîä, óñòàíîâèòü èìÿ çàäà÷è, å¸ ïðèîðèòåò. Èñïîëüçóþòñÿ òå æå òýãè,
÷òî è ó CreateNewProc().
DOS ïðåäîñòàâëÿåò âîçìîæíîñòü äîñòóïà ê ñïèñêó çàïóùåííûõ èç DOS
ïðîãðàìì. Êàæäàÿ òàêàÿ ïðîãðàììà èìååò óíèêàëüíûé íîìåð, êîòîðûé
ïîçâîëÿåò èäåíòèôèöèðîâàòü äàæå ïðîöåññû ñ îäèíàêîâûìè èìåíàìè.
Íóìåðóþòñÿ îíè ñ ÅÄÈÍÈÖÛ.
Äëÿ äîñòóïà ê ñïèñêó ñíà÷àëà íóæíî âûïîëíèòü ôóíêöèþ MaxCli(),
êîòîðàÿ âåðí¸ò ìàêñèìàëüíûé íîìåð ïðîöåññà, çàïóùåííîãî èç DOS. Ýòî
íå êîëè÷åñòâî ïðîöåññîâ, ðÿä íîìåðîâ ìîæåò áûòü íåçàíÿòûì ïî ïðè÷èíå
çàâåðøåíèÿ ïðîãðàìì. Ïîñëå ýòîãî â öèêëå îò åäèíèöû äî ðåçóëüòàòà
MacCli() âûïîëíÿåòñÿ FindCliProc(), ñ àðãóìåíòîì - ñ÷¸ò÷èêîì öèêëà
(D1). Ðåçóëüòàòîì êàæäîãî âûçîâà áóäåò óêàçàòåëü íà î÷åðåäíîé ïðîöåññ
èëè íóëü, åñëè òàêîâîé îòñóòñòâóåò.
Äëÿ îñòàíîâà êàêîé-ëèáî ïðîãðàììû íåîáõîäèìî ïîñëàòü åé ñèãíàë
SIGBREAKF_CTRL_C <dos/dos.#?>. Îñòàíîâ â ýòîì ñëó÷àå íå
ãàðàíòèðóåòñÿ, îäíàêî ìíîãèå ïðîãðàììû ïîääåðæèâàþò ýòî ñîãëàøåíèå.
32) Àðãóìåíòû êîìàíäíîé ñòðîêè
Êàê îïèñàíî âûøå, ïðîãðàììà íå ïîëó÷àåò ñâî¸ èìÿ â êîìàíäíîé
ñòðîêå. Âûÿñíèòü åãî ìîæíî ñ ïîìîùüþ ôóíêöèè GetProgramName(),
ïîëó÷àþùåé óêàçàòåëü íà áóôåð (D1) è åãî ðàçìåð (D2).
Åñòü íåñêîëüêî ñïîñîáîâ ðàáîòû ñ êîìàíäíîé ñòðîêîé:
- A0/D0.  ïðîãðàììå íà Ñè ãîëîâíàÿ ôóíêöèÿ çàäà¸òñÿ â âèäå:
__asm main(register __a0 char *string, register __d0 int len)
Ïåðâîå ñëîâî óêàçûâàþòñÿ òîëüêî äëÿ SAS/C. Åñëè ïðîãðàììà
êîìïèëèðóåòñÿ êàê A4-relative, òî äëÿ SAS/C ïåðåä __asm íóæíî
óêàçàòü __saveds, à äëÿ Hisoft C ïåðâîé îïåðàöèåé â main() áóäåò
GetBaseReg() - ïîäðîáíåå ÷èòàéòå â îïèñàíèè ñðåäñòâ ðàçðàáîòêè.
- GetArgStr() âîçâðàùàåò (D0) òî æå, ÷òî è ïåðåäà¸òñÿ â A0 ïðè
ñòàðòå ïðîãðàììû.  ýòîì ñëó÷àå âîçíÿ ñ àðãóìåíòàìè main() íå
òðåáóåòñÿ.
- ReadArgs(). Ýòî ñàìîå ìîùíîå è óäîáíîå ñðåäñòâî ðàáîòû ñ
àðãóìåíòàìè. ReadArgs() ïîëíîñòüþ ðàçáèðàåò êîìàíäíóþ ñòðîêó,
ïðåâðàùàÿ å¸ â ìàññèâ ñòðîê, ÷èñåë è ôëàãîâ, ñîîòâåòñòâóþùèõ
íàçíà÷åíèþ êëþ÷åâûõ ñëîâ.
33) ReadArgs()
ReadArgs() ðàçáèðàåò êîìàíäíóþ ñòðîêó â ñîîòâåòñòâèè ñ ïåðåäàííûì
åìó øàáëîíîì. Øàáëîí çàäà¸ò ðàçëè÷íûå êëþ÷è êîìàíäíîé ñòðîêè è èõ
òèïû. Øàáëîí ñîñòîèò èç ñïèñêà êëþ÷åé. Êëþ÷è íàçûâàþòñÿ «ïîëíûìè»
èìåíàìè, ãäå ýòî âîçìîæíî (íàïðèìåð, «Quick» âìåñòî «Q»). Òàêæå ìîãóò
áûòü çàäàíû ñîêðàùåíèÿ, ïóò¸ì èñïîëüçîâàíèÿ «ñîêðàùåíèå=êëþ÷»
(íàïðèìåð, «Q=Quick»).
Êëþ÷è â øàáëîíå ðàçäåëÿþòñÿ çàïÿòûìè. Äëÿ ïîëó÷åíèÿ ðåçóëüòàòà
ReadArgs(), Âû ïðîâåðÿåòå ìàññèâ ëîíãîâ, ïåðåäàííûé åìó (êàæäûé
ýëåìåíò ìàññèâà ñîîòâåòñòâóåò êëþ÷ó â øàáëîíå). Ìàññèâ äîëæåí áûòü
î÷èùåí (ëèáî èíèöèàëèçèðîâàí çíà÷åíèÿìè ïî óìîë÷àíèþ) äî ïåðåäà÷è åãî
ReadArgs(). ×òî èìåííî áóäåò ïîìåùåíî â êîíêðåòíûé ýëåìåíò ìàññèâà,
îïðåäåëÿåòñÿ òèïîì êëþ÷à. Ïî óìîë÷àíèþ ýòî áóäåò òåêñòîâàÿ ñòðîêà
(ïîñëåäîâàòåëüíîñòü ñèìâîëîâ, íå ñîäåðæàùàÿ ïðîáåëîâ, ëèáî çàêëþ÷¸ííàÿ
â êàâû÷êè) - â ýòîì ñëó÷àå ýëåìåíò ìàññèâà áóäåò ñîäåðæàòü óêàçàòåëü
íà ñòðîêó.
Ïîñëå êàæäîãî êëþ÷à ìîæåò áûòü óêàçàí ñóôôèêñ, óêàçûâàþùèé åãî
òèï. Ñóôôèêñû ñîñòîÿò èç «/» è îäèíî÷íîãî ñèìâîëà. Ó êëþ÷à ìîæåò
áûòü íåñêîëüêî ñóôôèêñîâ. Äîïóñòèìû ñëåäóþùèå ñóôôèêñû:
/S - Ïåðåêëþ÷àòåëü (Switch). Íàëè÷èå ðàññìàòðèâàåòñÿ êàê
ëîãè÷åñêîå çíà÷åíèå, óñòàíàâëèâàþùååñÿ ïðè ïîÿâëåíèè â
êîìàíäíîé ñòðîêå. Ýëåìåíò ìàññèâà èìååò ëîãè÷åñêèé òèï
(0 - íå óñòàíîâëåí, íåíóëåâîå çíà÷åíèå - óñòàíîâëåí).
/K - Ñòðîêà (Keyword). Ýëåìåíò ìàññèâà íå áóäåò çàïîëíåí, åñëè
êëþ÷ íå óêàçàí. Ê ïðèìåðó, åñëè â øàáëîíå óêàçàíî «Name/K»,
òî ïðè îòñóòñòâèè «Name=<string>» èëè «Name <string>» â
êîìàíäíîé ñòðîêå ýëåìåíò ìàññèâà íå áóäåò çàïîëíåí
/N - ×èñëî (Number). Ïàðàìåòð ðàññìàòðèâàåòñÿ êàê äåñÿòè÷íîå
÷èñëî, êîòîðîå áóäåò ïðåîáðàçîâàíî âûçîâîì ReadArgs. Åñëè
óêàçàíî íåâåðíîå çíà÷åíèå, âîçâðàùàåòñÿ îøèáêà. Ýëåìåíò
ìàññèâà áóäåò ñîäåðæàòü óêàçàòåëü íà ïîëó÷åííîå ÷èñëî
(òàêèì îáðàçîì Âû óçíàåòå, áûëî ëè îíî óêàçàíî).
/T - Ïåðåêëþ÷àòåëü (Toggle). Ïîõîæ íà Switch, íî ïðè íàëè÷èè
íå çàïîëíÿåò ýëåìåíò ìàññèâà, à «ïåðåêëþ÷àåò» åãî íà
ïðîòèâîïîëîæíîå çíà÷åíèå.
/A - Òðåáóåìûé (Required). Ýòîò êëþ÷ äîëæåí áûòü óêàçàí â
êîìàíäíîé ñòðîêå, ïðè åãî îòñóòñòâèè âîçâðàùàåòñÿ îøèáêà.
/F - Îñòàòîê ñòðîêè. Åñëè óêàçàí, îñòàòîê ñòðîêè ïîñëå êëþ÷à
áóäåò ïåðåäàí êàê ïàðàìåòð, äàæå åñëè â í¸ì âñòðå÷àþòñÿ
êàêèå-ëèáî åù¸ êëþ÷åâûå ñëîâà.
/M - Ìíîæåñòâî ñòðîê (Multiple strings). Ïàðàìåòðîì ÿâëÿåòñÿ
ëþáîå êîëè÷åñòâî ñòðîê, âîçâðàùàåìîå â âèäå óêàçàòåëÿ íà
ìàññèâ ñòðîê, çàêàí÷èâàþùèéñÿ íóëåâûì óêàçàòåëåì. Ëþáîé
àðãóìåíò, íå ÿâëÿþùèéñÿ ÷àñòüþ äðóãîãî àðãóìåíòà, áóäåò
äîáàâëåí â ýòîò ìàññèâ. Òîëüêî îäèí /M ìîæåò áûòü óêàçàí
â øàáëîíå. Ïðèìåð: äëÿ øàáëîíà «Dir/M,All/S» êîìàíäíàÿ
ñòðîêà «foo bar all qwe» óñòàíîâèò ëîãè÷åñêèé ýëåìåíò «all»,
è âåðí¸ò ìàññèâ ñòðîê, ñîäåðæàùèé «foo», «bar», and «qwe».
Ñóùåñòâóåò âçàèìîäåéñòâèå ìåæäó ïàðàìåòðàìè /M è /A. Åñëè ïîñëå
ðàçáîðà îñòàþòñÿ íåçàïîëíåííûå ïàðàìåòðû /A, îíè áóäóò çàïîëíåíû
ñòðîêàìè ñ êîíöà ñïèñêà ïðåäûäóùåãî ïàðàìåòðà /M. Ýòî èñïîëüçóåòñÿ
äëÿ ñëó÷àåâ òèïà Copy («From/A/M,To/A»).
Àðãóìåíòû ReadArgs() - óêàçàòåëü íà øàáëîí (D1), óêàçàòåëü íà
çàïîëíÿåìûé ìàññèâ (D2) è óêàçàòåëü íà ñòðóêòóðó RDargs (D3). Îáû÷íî
òðåòüèì àðãóìåíòîì ïåðåäàþò 0. Ôóíêöèÿ ïîäðîáíî îïèñàíà â dos.doc.
Êàæäûé âûçîâ ReadArgs() äîëæåí çàâåðøàòüñÿ âûçîâîì FreeArgs(),
êîòîðûé îñâîáîäèò çàíÿòóþ ReadArgs() ïàìÿòü.
34) Ïåðåìåííûå îêðóæåíèÿ
Ïåðåìåííûå - åù¸ îäèí ñïîñîá êàê ïåðåäà÷è ïðîãðàììå àðãóìåíòîâ,
òàê è ïîëó÷åíèÿ îò íå¸ ðåçóëüòàòà. Êðîìå òîãî, ýòî îñíîâíîå ñðåäñòâî
õðàíåíèÿ äàííûõ â shell-ñêðèïòàõ, à òàêæå ìåõàíèçì õðàíåíèÿ alias-îâ
êîìàíä.
Ïåðåìåííûå ìîãóò áûòü ËÎÊÀËÜÍÛÌÈ è ÃËÎÁÀËÜÍÛÌÈ. Ëîêàëüíûå
ïåðåìåííûå â äàííûé ìîìåíò äîñòóïíû òîëüêî îäíîé çàäà÷å. Îíè
ñîõðàíÿþòñÿ âñ¸ âðåìÿ ðàáîòû shell-ñêðèïòà è äîñòóïíû âñåì ïðîãðàììàì,
çàïóñêàåìûì èç ýòîãî ñêðèïòà. Íåñêîëüêî ðàçíûõ çàäà÷ îäíîâðåìåííî
ìîãóò èìåòü ðàçíûå ïåðåìåííûå ñ îäèíàêîâûìè èìåíàìè, ïîñêîëüêó
ðàáîòàþò â ðàçíûõ shell-ïðîöåññàõ.
Ãëîáàëüíûå ïåðåìåííûå (îíè æå ïåðåìåííûå îêðóæåíèÿ - environment)
ãëîáàëüíû äëÿ âñåé ñèñòåìû. Ïåðåìåííàÿ, óñòàíîâëåííàÿ èç îäíîé çàäà÷è,
áóäåò âèäíà äðóãîé çàäà÷å.
Ïåðåìåííûå ñîäåðæàò ïðîèçâîëüíóþ èíôîðìàöèþ. Ðåêîìåíäóåòñÿ, ÷òîáû
ýòî áûë ASCII òåêñò - íî ýòî íå ÿâëÿåòñÿ îáÿçàòåëüíûì òðåáîâàíèåì.
Ïåðåìåííûå èäåíòèôèöèðóþòñÿ èìåíåì, êîòîðîå ñîîòâåòñòâóåò ôîðìàòó
èì¸í ôàéëîâîé ñèñòåìû.
SetVar() ïðèñâàèâàåò ïåðåìåííîé îïðåäåë¸ííîå çíà÷åíèå. Åñëè
ïåðåìåííàÿ åù¸ íå ñóùåñòâóåò, îíà ñîçäà¸òñÿ. Àðãóìåíòû - èìÿ
ïåðåìåííîé (D1), áóôåð äàííûõ è åãî ðàçìåð (D2, D3), è ôëàãè (D4).
Ôëàãè ñîäåðæàò òèï ïåðåìåííîé LV_VAR (ïåðåìåííàÿ) èëè LV_ALIAS (alias
shell-êîìàíä), è îáëàñòü äåéñòâèÿ GVF_LOCAL_ONLY èëè GVF_GLOBAL_ONLY
<dos/var.#?>.
GetVar() âîçâðàùàåò çíà÷åíèå ïåðåìåííîé ïî èìåíè. Àðãóìåíòû - èìÿ
(D1), çàïîëíÿåìûé áóôåð (D2) è åãî ðàçìåð (D3), è ôëàãè (D4). Ôëàãè
ïîçâîëÿþò ñ÷èòûâàòü íå-ASCII ïåðåìåííóþ, ÷òîáû áóôåð íå îêàí÷èâàëñÿ
êîäîì LF (GVF_BINARY_VAR) è íóë¸ì (GVF_DONT_NULL_TERM), à òàêæå
çàäàâàèòü îáëàñòü âèäèìîñòè (GVF_LOCAL_ONLY èëè GVF_GLOBAL_ONLY). Ïî
óìîë÷àíèþ ñíà÷àëà èùåòñÿ ëîêàëüíàÿ ïåðåìåííàÿ, è òîëüêî åñëè îíà íå
íàéäåíà, èùåòñÿ ãëîáàëüíàÿ.
Ðåçóëüòàò - äëèíà ïåðåìåííîé èëè -1, åñëè îíà íå íàéäåíà.
DeleteVar() óäàëÿåò çàäàííóþ èìåíåì (D1) ïåðåìåííóþ. Ôëàãè (D2)
ïîçâîëÿþò óêàçàòü îáëàñòü äåéñòâèÿ (GVF_LOCAL_ONLY, GVF_GLOBAL_ONLY).
LV_VAR - åäèíñòâåííûé òèï, êîòîðûé ìîæåò áûòü ãëîáàëüíûì.
FindVar() ïî èìåíè (D1) è òèïó (D2) âîçâðàùàåò óêàçàòåëü íà
ñòðóêòóðó LocalVar, îïèñûâàþùóþ ëîêàëüíóþ ïåðåìåííóþ.
35) Ðàáîòà ñ ôàéëàìè
Ðàáîòà ñ ôàéëàìè îñóùåñòâëÿåòñÿ ôóíêöèÿìè dos.library:
Open() - îòêðûòèå ôàéëà
Close() - çàêðûòèå ôàéëà
Read() - ÷òåíèå èç ôàéëà
Write() - çàïèñü â ôàéë
Àðãóìåíòàìè Open() ÿâëÿþòñÿ èìÿ (D1) è ðåæèì äîñòóïà (D2). Èìÿ
ìîæåò ñîäåðæàòü ïóòü ê ôàéëó, ïóòü ìîæåò áûòü êàê àáñîëþòíûì, òàê è
îòíîñèòåëüíûì - îòíîñèòåëüíî òåêóùåé äèðåêòîðèè. Ôóíêöèè ðàáîòàþò êàê
ñ ôàéëàìè íà äèñêàõ, òàê è ñ ëþáûìè óñòðîéñòâàìè - êîòîðûìè ìîãóò áûòü
«SER:» (ïîñëåäîâàòåëüíûé ïîðò), «PAR:» (ïàðàëëåëüíûé ïîðò) è ò.ä.
Òàêèì îáðàçîì, Read() è Write() îïåðèðóþò ïðîèçâîëüíûìè ïîòîêàìè
äàííûõ. Ðåæèì äîñòóïà - êîíñòàíòà, îïðåäåëÿþùàÿ ðåæèì ðàáîòû:
MODE_OLDFILE îòêðûâàåò ñóùåñòâóþùèé ôàéë (è âîçâðàùàåò îøèáêó, åñëè
ôàéë íå íàéäåí), MODE_NEWFILE ñîçäà¸ò íîâûé ôàéë (è óäàëÿåò ñòàðûé ñ
òàêèì æå èìåíåì ïðè åãî íàëè÷èè), MODE_READWRITE ñîçäà¸ò íîâûé ïðè
îòñóòñòâèè è îòêðûâàåò èìåþùèéñÿ ïðè íàëè÷èè. Êîíñòàíòû îïèñàíû â
<dos/dos.#?>.
Ôóíêöèåé Open() âîçâðàùàåòñÿ filehandle - óíèêàëüíîå 32-áèòíîå
÷èñëî, èäåíòèôèöèðóþùåå îòêðûòûé ôàéë. Ñ ýòîãî ìîìåíòà ëþáûì
îïåðàöèÿì íàä ýòèì ôàéëîì ïåðåäà¸òñÿ èìåþùèéñÿ filehandle. Çàâåðøàåòñÿ
ðàáîòà ñ ôàéëîì ôóíêöèåé Close(), òàêæå ïîëó÷àþùåé filehandle (D1).
Ïîñëå ýòîãî çíà÷åíèå filehandle íåäåéñòâèòåëüíî, è âñÿêèå ïîïûòêè
ðàáîòàòü ñ íèì ìîãóò âûçâàòü ñáîé ñèñòåìû.
×òåíèå îñóùåñòâëÿåòñÿ ôóíêöèåé Read(). Ÿ àðãóìåíòàìè ñëóæàò
filehandle (D1), óêàçàòåëü íà áóôåð â ïàìÿòè (D2) è òðåáóåìûé îáú¸ì
(D3). Åñëè îïåðàöèÿ âûïîëíåíà óñïåøíî, Read() âîçâðàùàåò îáú¸ì
ðåàëüíî ïðî÷èòàííûõ äàííûõ. Ýòîò îáú¸ì ìîæåò áûòü ìåíüøå
çàïðîøåííîãî. Ýòî íå ÿâëÿåòñÿ îøèáêîé - íàïðèìåð, ïðè ïîïûòêå ÷òåíèÿ
100 áàéò èç 50-áàéòíîãî ôàéëà ðåçóëüòàòîì áóäåò ðåàëüíàÿ äëèíà ôàéëà.
Åñëè îïåðàöèÿ çàâåðøèëàñü ñ îøèáêîé, â ðåçóëüòàòå âîçâðàùàåòñÿ -1.
Çàïèñü îñóùåñòâëÿåòñÿ ôóíêöèåé Write(), ïî ôîðìàòó âûçîâà è
ðåçóëüòàòàì àíàëîãè÷íîé ôóíêöèè Read().
Íåñêîëüêî ïîñëåäîâàòåëüíûõ çàïðîñîâ ÷òåíèÿ ÷èòàþò ñëåäóþùèå äðóã
çà äðóãîì ó÷àñòêè ôàéëà. DOS çàïîìèíàåò òåêóùóþ ïîçèöèþ â ôàéëå è
ïîñëå êàæäîãî çàïðîñà ñäâèãàåò å¸ âïåð¸ä íà ïðî÷èòàííîå êîëè÷åñòâî
áàéò. Ñóùåñòâóåò âîçìîæíîñòü ïåðåäâèíóòü å¸ «âðó÷íóþ», íàïðèìåð äëÿ
ïîâòîðíîãî ÷òåíèÿ òîãî æå ó÷àñòêà ôàéëà - äëÿ ýòîãî ñëóæèò ôóíêöèÿ
Seek(), àðãóìåíòû êîòîðîé - filehandle (D1), íîâàÿ ïîçèöèÿ â ôàéëå
(D2) è ðåæèì (D3). Ðåæèì - îäíà èç êîíñòàíò <dos/dos.#?>:
OFFSET_BEGINNING
OFFSET_CURRENT
OFFSET_END
÷òî ïîçâîëÿåò àäðåñîâàòüñÿ îò íà÷àëà ôàéëà, îò òåêóùåé ïîçèöèè â
í¸ì èëè îò êîíöà ôàéëà. Ïîñêîëüêó filehandle ìîæåò ñîîòâåòñòâîâàòü
ïðîèçâîëüíîìó ïî ñâîåé ñóòè ïîòîêó, Seek() ðàáîòàåò íå âî âñåõ ñëó÷àÿõ
- íàïðèìåð, ïðè ïîïûòêå âûçîâà åãî íà «SER:» âåðí¸òñÿ îøèáêà.
Ïîçèöèþ â ôàéëå íåëüçÿ ñäâèãàòü çà åãî ïðåäåëû. Åñëè íåîáõîäèìî
ñîçäàòü íà äèñêå ôàéë çàäàííîé äëèíû áåç çàòðàò âðåìåíè íà çàïèñü,
èñïîëüçóåòñÿ ôóíêöèÿ SetFileSize(), êîòîðîé ïåðåäà¸òñÿ filehandle
(D1), ïîçèöèÿ êîíöà ôàéëà (D2) è ðåæèì (D3), àíàëîãè÷íûé ðåæèìàì
Seek(). Ýòà æå ôóíêöèÿ ïîçâîëÿåò è «îáêóñûâàòü» ñóùåñòâóþùèå ôàéëû.
Î×ÅÍÜ ÂÀÆÍÎÅ ÇÀÌÅ×ÀÍÈÅ. Íå ñëåäóåò ïóòàòü ñðåäñòâà ðàáîòû ñ
ôàéëàìè DOS è ANSI C. Òî, ÷òî âîçâðàùàþò ôóíêöèè òèïà fopen(), íå
èìååò îòíîøåíèÿ ê filehandle, õîòÿ è ïðåäíàçíà÷åíû äëÿ òîãî æå!
36) Áóôåðèçîâàííûé ââîä-âûâîä
Âñÿêàÿ îïåðàöèÿ ñ ôóíêöèÿìè Read() è Write() ìîæåò âûçâàòü
îáðàùåíèå ê äèñêó. Òàêèì îáðàçîì, íàïðèìåð, çàïèñü ïîðöèÿìè ïî 10
áàéò âûçîâåò äëÿ êàæäîãî îáðàùåíèå ñ÷èòûâàíèå òåêóùåãî áëîêà,
ìîäèôèêàöèþ ýòèõ 10 áàéò è çàïèñü áëîêà. Â èòîãå, äëÿ ðÿäà îïåðàöèé
îïèñàííûé âûøå ïîäõîä (íàçûâàåìûé íåáóôåðèçîâàííûì ââîäîì-âûâîäîì)
÷ðåçâû÷àéíî íåýôôåêòèâåí.
Äëÿ ïîâûøåíèÿ ýôôåêòèâíîñòè òàêèõ îïåðàöèé ïðèìåíÿåòñÿ
áóôåðèçîâàííûé ââîä-âûâîä.  ýòîì ñëó÷àå äàííûå ñ÷èòûâàþòñÿ ïîáëî÷íî
â áóôåð, à ïîðöèè íåáîëüøîãî ðàçìåðà âûäàþòñÿ óæå èç áóôåðà, íå òðåáóÿ
ëèøíèõ îáðàùåíèé ê äèñêó. Òàê, è ïðè çàïèñè, ñîäåðæèìîå áóôåðà
ñáðàñûâàåòñÿ íà äèñê òîëüêî ïðè åãî çàïîëíåíèè.
Ôóíêöèè FRead() è FWrite() ÿâëÿþòñÿ áóôåðèçîâàííûìè àíàëîãàìè
Read() è Write(), ñ òîé ëèøü ðàçíèöåé, ÷òî åù¸ îäíèì èõ àðãóìåíòîì
ÿâëÿåòñÿ êîëè÷åñòâî áëîêîâ (D4), äëèíà êîòîðûõ çàäàíà òðåòüèì.
Ðåçóëüòàò â ñëó÷àå óñïåøíîãî çàâåðøåíèÿ - êîëè÷åñòâî áëîêîâ.
Ôóíêöèÿ FGetC() ñ÷èòûâàåò åäèíñòâåííûé ñèìâîë, ïîëó÷àÿ íà âõîäå
filehandle (D1), à ôóíêöèÿ FPutC() çàïèñûâàåò ñèìâîë, óêàçàííûé âòîðûì
àðãóìåíòîì (D2). Ôóíêöèè FGets() è FPuts() âûïîëíÿþò òî æå ñàìîå äëÿ
ñòðîê, âòîðîé àðãóìåíò - óêàçàòåëü íà ñòðîêó (D2), ó FGets() òðåòüèì
àðãóìåíòîì (D3) èä¸ò îáú¸ì áóôåðà, âûäåëåííîãî ïîä ñòðîêó.
Ôóíêöèÿ Flush() ñáðàñûâàåò íå çàïîëíåííûé äî êîíöà áóôåð â
âûõîäíîé ïîòîê. Åñëè ýòîãî íå ñäåëàòü, ïîòîê áóäåò íå ñáðîøåí, è, ê
ïðèìåðó, îêîí÷àíèå òåêñòà â êîíñîëüíîå îêíî áóäåò âûâåäåíî òîëüêî
ïîñëå çàêðûòèÿ ôàéëà, à íå íåïîñðåäñòâåííî ïîñëå åãî âûâîäà.
Áóôåðèçîâàííûé è íåáóôåðèçîâàííûé ââîä-âûâîä ìîæíî ÷åðåäîâàòü íà
îäíîì è òîì æå ôàéëå. Ãëàâíîå - ïîìíèòü, ÷òî ïåðåä êàæäûì ïåðåõîäîì
íà íåáóôåðèçîâàííûé âûâîä ñëåäóåò ÎÁßÇÀÒÅËÜÍÎ âûïîëíèòü Flush()!
SetVBuf() óïðàâëÿåò ðàáîòîé áóôåðèçàöèè. Àðãóìåíòû - filehandle
(D1), óêàçàòåëü íà áóôåð (D2), ðåæèì áóôåðèçàöèè (D3) è ðàçìåð áóôåðà
(D4). Åñëè óêàçàòåëü íà áóôåð íóëåâîé, DOS ñàì áóäåò çàõâàòûâàòü
ïàìÿòü ïîä áóôåð, ïðåäâàðèòåëüíî îñâîáîæäàÿ ïðåäûäóùèé. Åñëè óêàçàí
ðàçìåð -1, áóäåò èçìåí¸í òîëüêî ðåæèì áóôåðèçàöèè.
Äîñòóïíû ñëåäóþùèå ðåæèìû áóôåðèçàöèè <dos/stdio.#?>:
BUF_LINE - áóôåð ñáðàñûâàåòñÿ ïîñëå êàæäîé ñòðîêè
BUF_FULL - áóôåð ñáðàñûâàåòñÿ òîëüêî ïî çàïîëíåíèþ èëè Flush()
BUF_NONE - áóôåðèçàöèÿ îòêëþ÷åíà
Ñëåäóåò îòìåòèòü, ÷òî îïèñàííûé áóôåðèçîâàííûé ââîä-âûâîä òàêæå
íåýôôåêòèâåí äëÿ îïåðàöèé ñ áîëüøèìè ìàññèâàìè, ïîñêîëüêó ôàêòè÷åñêè
òðåáóåò äâîéíîãî êîïèðîâàíèÿ - â áóôåð è â ïàìÿòü çàäà÷è.
37) Ðàáîòà ñ êîíñîëüþ
Shell-îêíî, èç êîòîðîãî çàïóñêàåòñÿ ïðîãðàììà, ôàêòè÷åñêè òîæå
ïðåäñòàâëÿåò ñîáîé ôàéë. Òî÷íåå, ýòî äâà ôàéëà, íà ââîä è íà âûâîä
(â ñòàíäàðòå ANSI C èì ñîîòâåòñòâóþò ïîòîêè stdin è stdout). Ýòè äâà
ôàéëà âñåãäà (ïîêà ðàáîòàåò ïðîãðàììà) îòêðûòû. Ñîîòâåòñòâóþùèå
èì filehandles ìîæíî ïîëó÷èòü ôóíêöèÿìè dos.library Input() è Output()
ñîîòâåòñòâåííî. Ñ íèìè ðàáîòàþò âñå îïèñàííûå âûøå ñðåäñòâà DOS. Ïî
çàâåðøåíèþ ðàáîòû ñ íèìè, â îòëè÷èå îò îòêðûòûõ Âàìè ôàéëîâ, ýòè
filehandles çàêðûâàòü ÍÅËÜÇß!
Äëÿ âûâîäà â êîíñîëü îáû÷íî ïðèìåíÿþò ìåõàíèçì ôîðìàòíûõ ñòðîê.
Ôîðìàòíàÿ ñòðîêà - ýòî âûâîäèìûé òåêñò, êîòîðûé «ðàçáàâëåí» ðàçëè÷íûìè
óïðàâëÿþùèìè ïîñëåäîâàòåëüíîñòÿìè. Îíè íà÷èíàþòñÿ ñ ñèìâîëà «ïðîöåíò»
è ïðè âûâîäå çàìåíÿþòñÿ ïîäñòðîêàìè, ÷èñëàìè â ðàçíûõ ñèñòåìàõ
ñ÷èñëåíèÿ è ò.ï. Áîëåå ïîäðîáíî îá ýòîì ìîæíî ïðî÷èòàòü â ëþáîé êíèãå
ïî ÿçûêó Ñè.
Îáðàáîòêà ôîðìàòíûõ ñòðîê íà íèçêîì óðîâíå â AmigaOS âûïîëíÿåòñÿ
ôóíêöèåé Exec RawDoFmt(). Ÿ àðãóìåíòû - ôîðìàòíàÿ ñòðîêà (A0),
óêàçàòåëü íà ìàññèâ àðãóìåíòîâ (A1), óêàçàòåëü íà ôóíêöèþ âûâîäà (A2)
è ïåðåäàâàåìûé åé óêàçàòåëü (A3). RawDoFmt() ìîæåò ðàáîòàòü ñ
ôîðìàòíîé ñòðîêîé, âûâîäÿ ðåçóëüòàò ôîðìàòèðîâàíèÿ êóäà óãîäíî - â
ôàéë, â ïàìÿòü è ò.ï., ïîçâîëÿÿ îòñëåäèòü òàêèå ÿâëåíèÿ, êàê
ïåðåïîëíåíèå áóôåðà. Âûâîä ðåçóëüòàòà âåä¸òñÿ ïîñèìâîëüíî, äëÿ ýòîãî
âûçûâàåìàÿ ïî óêàçàòåëþ â òðåòüåì àðãóìåíòå ôóíêöèÿ ïîëó÷àåò î÷åðåäíîé
ñèìâîë â ðåãèñòðå D0. Êëàññè÷åñêèé âèä ýòîé ôóíêöèè:
move.l d0,(a3)+
rts
 òàêîì ñëó÷àå ðåçóëüòèðóþùàÿ ñòðîêà áóäåò ðàçìåùåíà â ïàìÿòè ïî
àäðåñó, óêàçàííîìó ÷åòâ¸ðòûì àãðóìåíòîì RawDoFmt(). Ïðè íàïèñàíèè
ïðîãðàììû íà Ñè ýòó ôóíêöèþ ìîæíî íàïèñàòü îòäåëüíî íà àññåìáëåðå.
Òî, ÷òî ïîëó÷èòñÿ â ðåçóëüòàòå, ÿâëÿåòñÿ íåêèì ïîäîáèåì ôóíêöèè
sprintf() ANSI C, íî ïðè ýòîì íå òðåáóåò ëèíêîâêè ñ ïðîãðàììîé
êèëîáàéò íåíóæíîãî êîäà.
Ñïåöèôèêàöèÿ ôîðìàòíûõ ñòðîê, èñïîëüçóåìûõ ôóíêöèåé RawDoFmt(),
ïî ñðàâíåíèþ ñ îïèñàííîé â ñòàíäàðòå Ñè íåñêîëüêî óïðîùåíà - â
÷àñòíîñòè, íå ïîääåðæèâàþòñÿ ÷èñëà ñ ïëàâàþùåé òî÷êîé (âïðî÷åì, íà
ïðàêòèêå ïðèìåíÿåìûå èñêëþ÷èòåëüíî ðåäêî). Áîëåå ïîäðîáíî ýòîò âîïðîñ
îñâåù¸í â exec.doc.
Áîëåå âûñîêîóðîâíåâîé ôóíêöèåé DOS ÿâëÿåòñÿ Printf(), ïî ñóòè -
àíàëîã ñèøíîãî printf(). Àðãóìåíòû åãî òå æå - ôîðìàòíàÿ ñòðîêà (D1)
è íàáîð àðãóìåíòîâ (D2 - äëÿ íåçíàêîìûõ ñ ýòîé ôóíêöèåé èìååò ñìûñë
èçó÷èòü ñèøíóþ äîêóìåíòàöèþ). Òàêæå äîñòóïåí FPrintf(), ïåðâûì
àðãóìåíòîì êîòîðîãî óêàçûâàåòñÿ filehandle.
Î×ÅÍÜ ÂÀÆÍÛÉ ÌÎÌÅÍÒ. Ðàçìåð öåëîãî òèïà äëÿ RawDoFmt() è âñåõ
èñïîëüçóþùèõ åãî ôóíêöèé - 16 áèò! Òàêèì îáðàçîì, äëÿ ðàáîòû ñ
32-áèòíûìè ÷èñëàìè íåîáõîäèìî ïðèìåíÿòü ôëàã «l». Ïðèìåð:
Printf("Ïå÷àòàåì 32-áèòíîå äåñÿòè÷íîå ÷èñëî: %ld\n",number);
PutStr() - ïå÷àòü îáû÷íîé (íåôîðìàòíîé) ñòðîêè (D1).
WriteChars() - ïå÷àòü ñòðîêè (D1) îïðåäåë¸ííîé äëèíû (D2).
Àíàëîãîâ scanf() â DOS íåò. Âïðî÷åì, ïî ïðè÷èíå ãðàôè÷åñêîé ñóòè
AmigaOS ïîäîáíûå ñðåäñòâà òîæå òðåáóþòñÿ èñêëþ÷èòåëüíî ðåäêî.
Ïðîãðàììû ñ êîíñîëüíûì èíòåðôåéñîì îãðàíè÷èâàþòñÿ àíàëèçîì êîìàíäíîé
ñòðîêè è âûâîäîì ñëóæåáíîé èíôîðìàöèè, âçàèìîäåéñòâèå ñ ïîëüçîâàòåëåì
ïðèíÿòî äåëàòü ñ ïîìîùüþ GUI.
Ïðîãðàììà íå îãðàíè÷åíà ñâîèì êîíñîëüíûì îêíîì, îíà èìååò
âîçìîæíîñòü îòêðûòü åù¸ íåñêîëüêî ïîäîáíûõ îêîí. Äëÿ ýòîãî íà çàïèñü
îòêðûâàåòñÿ ôàéë âèäà «CON:» èëè «RAW:». Ïåðâîå îò âòîðîãî îòëè÷àåòñÿ
òåì, ÷òî â ñëó÷àå CON âåñü êëàâèàòóðíûé ââîä áóôåðèçóåòñÿ, è ïðîãðàììà
ïîëó÷àåò ãîòîâóþ ñòðîêó ïî íàæàòèþ ENTER (÷òî ïîçâîëÿåò îðãàíèçîâàòü
ðåäàêòîð ñòðîêè è history-áóôåð), à â ñëó÷àå RAW ëþáîé ââåä¸ííûé
ñèìâîë òóò æå ïîñòóïàåò âî âõîäíîé ïîòîê. Êðîìå òîãî, ââåä¸ííûå
â CON ñèìâîëû òóò æå îòîáðàæàþòñÿ â îêíå, à â ñëó÷àå RAW ýòîãî íå
ïðîèñõîäèò. Shell-îêíî, â êîòîðîì ðàáîòàåò ïðîãðàììà, èìååò òèï CON.
Ïîñëå èìåíè óñòðîéñòâà ìîæíî ÷åðåç ñëýø óêàçûâàòü ïàðàìåòðû. Ýòî
ïîäðîáíî ðàñïèñàíî â êíèãå Ä.Ìèõàéëîâà «AMIGA #1».
Ñóùåñòâóåò ñïîñîá îòêðûòèÿ íîâîãî ôàéëà, ÷òîáû ââîä-âûâîä áûë
íàïðàâëåí íà òåêóùåå îêíî. Äëÿ ýòîãî èñïîëüçóåòñÿ èìÿ «CONSOLE:».
Äàííûé ñïîñîá óäîáåí äëÿ ïðîãðàìì, êîòîðûå âûâîäÿò èíôîðìàöèþ òîëüêî
â ôàéë, à íå â Output().
38) Îáðàáîòêà îøèáîê
Ïîñêîëüêó ïðèçíàêîì îøèáêè îáû÷íî ÿâëÿåòñÿ íóëü èëè ìèíóñ
åäèíèöà, à ïðè÷èí îøèáîê ìîæåò áûòü ìíîæåñòâî, â DOS ñóùåñòâóåò
ìåõàíèçì «âòîðè÷íûõ» êîäîâ îøèáîê.
Åñëè ïðîèçîøëà îøèáêà, å¸ êîä ìîæíî âûÿñíèòü ôóíêöèåé IoErr() áåç
àðãóìåíòîâ. Êîäû îøèáîê DOS îïèñàíû â <dos/dos.#?>. Ýòîò æå
ìåõàíèçì èñïîëüçóåòñÿ âî ìíîãèõ äðóãèõ ñèñòåìíûõ áèáëèîòåêàõ. Äëÿ
õðàíåíèÿ êîäà îøèáêè èñïîëüçóåòñÿ ñïåöèàëüíî âûäåëåííîå äëÿ ýòîé öåëè
ïîëå ñòðóêòóðû Process - pr_Result2.
×òîáû íå âûâîäèòü ïîëüçîâàòåëþ íåâðàçóìèòåëüíûå íîìåðà, ñ êàæäîé
îøèáêîé ñâÿçàíà òåêñòîâàÿ ñòðîêà íà ÿçûêå, óñòàíîâëåííîì â ñèñòåìå.
Ýòà ñòðîêà âîçâðàùàåòñÿ ôóíêöèåé Fault(), àðãóìåíòû êîòîðîé - êîä
îøèáêè (D1), çàãîëîâîê (D2), áóôåð, êóäà áóäåò ñêîïèðîâàíà ñòðîêà (D3)
è åãî ðàçìåð (D4).
Çàãîëîâîê - ñòðîêà, êîòîðàÿ áóäåò ðàçìåùåíà ïåðåä òåêñòîì, è
îòäåëåíà îò îïèñàíèÿ îøèáêè äâîåòî÷èåì.  ðåçóëüòàòå, ìîæíî ïîëó÷àòü
ñòðîêè òèïà «Can't create archive: object not found».
PrintfFault() âûâîäèò òî æå â Output() - â ýòîì ñëó÷àå áóôåð è
åãî äëèíà íå óêàçûâàþòñÿ.
39) Îïåðàöèè ñ îáúåêòàìè
 äàííîì êîíòåêñòå «îáúåêò» (object) - ýòî ïðîèçâîëüíûé ýëåìåíò
äèðåêòîðèè, áóäü òî ôàéë èëè ïîääèðåêòîðèÿ.
DeleteFile(), íåñìîòðÿ íà íàçâàíèå, óäàëÿåò êàê çàäàííûé ôàéë
(D1), òàê è äèðåêòîðèþ. Ïåðåä óäàëåíèåì äèðåêòîðèè äîëæíî áûòü
óäàëåíî âñ¸ å¸ ñîäåðæèìîå.
Rename() ïåðåèìåíîâûâàåò îáúåêò, çàäàííûé ïåðâûì àðãóìåíòîì (D1),
âî âòîðîé (D2). Ýòèì æå ñïîñîáîì îáúåêò ìîæíî ïåðåìåùàòü â äðóãóþ
äèðåêòîðèþ - íî òîëüêî íà òîì æå äèñêå!
SetComment() óñòàíàâëèâàåò êîììåíòàðèé (D2) îáúåêòó (D1).
SetFileDate() óñòàíàâëèâàåò ïðîèçâîëüíóþ äàòó/âðåìÿ ïîñëåäíåé
ìîäèôèêàöèè îáúåêòà (D1), çàäàííóþ ñòðóêòóðîé DateStamp (D2).
SetProtection() óñòàíàâëèâàåò HSPARWED ôëàãè (D2) ôàéëó (D1).
40) ×òî òàêîå Lock
Ôóíêöèÿ Lock() ïîçâîëÿåò îãðàíè÷èòü äîñòóï ê îáúåêòó. Äîñòóï
ìîæíî îãðàíè÷èòü ëèáî òîëüêî ïî çàïèñè (shared lock), ëèáî êàê ïî
çàïèñè, òàê è ïî ÷òåíèþ (exclusive lock).  ëþáîì ñëó÷àå áóäåò
çàïðåùåíà âñÿêàÿ ìîäèôèêàöèÿ ñîäåðæèìîãî îáúåêòà, âêëþ÷àÿ åãî
óäàëåíèå. Àðãóìåíòû - èìÿ îáúåêòà (D1) è òèï Lock (D2), ïðèíèìàþùèé
çíà÷åíèÿ ACCESS_READ (shared) èëè ACCESS_WRITE (exclusive).
Ðåçóëüòàò ýòîé ôóíêöèè - óíèêàëüíîå 32-áèòíîå ÷èñëî, ïî ñóòè
íåìíîãî ïîõîæåå íà filehandle. Lock ñóùåñòâóåò äî òåõ ïîð, ïîêà íå
áóäåò âûïîëíåíà ôóíêöèÿ UnLock() (D1), ðåçóëüòàòîì êîòîðîé ÿâëÿåòñÿ
îñâîáîæäåíèå îáúåêòà, à lock ñòàíîâèòñÿ íåäåéñòâèòåëüíûì.
Ïðè îòêðûòèè ôàéëà ôóíêöèåé Open() ïðåäâàðèòåëüíî âûïîëíÿòü
Lock() ÍÅ ÍÓÆÍÎ - ýòî äåëàåòñÿ ñèñòåìîé êàê áû àâòîìàòè÷åñêè.
Èìåÿ lock íà ôàéë (íå íà äèðåêòîðèþ!), ìîæíî «ïåðåäåëàòü» åãî â
filehandle (îáðàòíîå íåâîçìîæíî). Äëÿ ýòîãî ñóùåñòâóåò ôóíêöèÿ
OpenFromLock(), àðãóìåíòîì êîòîðîé ñëóæèò lock (D1). Åñëè ôóíêöèÿ
âûïîëíåíà óñïåøíî (íå íóëåâîé ðåçóëüòàò), lock ñ ýòîãî ìîìåíòà
íåäåéñòâèòåëåí, è UnLock() äåëàòü ÍÅ ÍÓÆÍÎ (ñóäÿ ïî âñåìó, äîñòàòî÷íî
ðàñïðîñòðàí¸ííàÿ ïðîãðàììåðñêàÿ îøèáêà) - è âìåñòî íåãî ïî çàâåðøåíèþ
ðàáîòû íóæíî âûïîëíèòü Close().
Ïðè íåîáõîäèìîñòè ìîæíî ïîëó÷èòü äóáëèêàò Lock-à - äëÿ ýòîãî
ñóùåñòâóåò ôóíêöèÿ DupLock(), êîòîðîé ïåðåäà¸òñÿ èìåþùèéñÿ lock (D1).
Ýòî ïîçâîëÿåò ïîëó÷èòü êîïèþ lock-à, íàïðèìåð, äëÿ äðóãîé çàäà÷è.
Ïðîñòîå êîïèðîâàíèå lock-à ñ ýòîé öåëüþ íåäîïóñòèìî!
DupLockFromFH() ïîçâîëÿåò ïîëó÷èòü Lock ïî filehandle (D1).
 îòëè÷èå îò OpenFromLock(), filehandle îñòà¸òñÿ äåéñòâèòåëüíûì.
SameLock(), ïîëó÷àþùàÿ äâà lock-à (D1, D2), ïîçâîëÿåò âûÿñíèòü,
ïðèíàäëåæàò ëè ýòè lock-è îäíîìó îáúåêòó. Ðåçóëüòàòîì ìîæåò áûòü:
LOCK_SAME - îäèí è òîò æå îáúåêò
LOCK_SAME_VOLUME - ðàçíûå îáúåêòû â ïðåäåëàõ îäíîãî äèñêà
LOCK_DIFFERENT - ðàçíûå îáúåêòû íà ðàçíûõ äèñêàõ
Ïîõîæàÿ ôóíêöèÿ SameDevice() ïîçâîëÿåò îïðåäåëèòü, íàõîäÿòñÿ ëè
îáúåêòû â ïðåäåëàõ îäíîãî ôèçè÷åñêîãî óñòðîéñòâà (âîçìîæíî, íà ðàçíûõ
ðàçäåëàõ).
41) Òåêóùàÿ äèðåêòîðèÿ
Òåêóùóþ äèðåêòîðèþ ìîæíî èçìåíèòü ôóíêöèåé CurrentDir(),
àðãóìåíòîì êîòîðîé ÿâëÿåòñÿ lock íà íîâóþ òåêóùóþ äèðåêòîðèþ (D1).
Ðåçóëüòàò å¸ - lock íà ñòàðóþ.
Ñóùåñòâóåò äâà ïðàâèëà, êîòîðûå íóæíî îáÿçàòåëüíî ñîáëþäàòü:
- lock íà òåêóùóþ äèðåêòîðèþ äîëæåí áûòü âàëèäíûì ÂѨ âðåìÿ, ïîêà
îíà îñòà¸òñÿ òåêóùåé. Åñëè íàä íèì âûïîëíåí UnLock(), ïîïûòêà
îáðàùåíèÿ ïî ïóòè îòíîñèòåëüíî òåêóùåé äèðåêòîðèè ïðèâåä¸ò ê ñáîþ
ñèñòåìû!
- ïðîãðàììà ÎÁßÇÀÍÀ ïðè âûõîäå ñäåëàòü òåêóùåé òó äèðåêòîðèþ,
êîòîðóþ îíà ïîëó÷èëà ïðè ñòàðòå. Åäèíñòâåííîå èñêëþ÷åíèå èç
ýòîãî ïðàâèëà - êîìàíäà cd.
Lock íà òåêóùóþ äèðåêòîðèþ ìîæåò áûòü íóë¸ì - ýòî îçíà÷àåò
êîðíåâóþ äèðåêòîðèþ ñèñòåìíîãî äèñêà.
42) Äèðåêòîðèÿ, îòêóäà çàïóùåíà ïðîãðàììà
Ðàçóìååòñÿ, ýòà äèðåêòîðèÿ çàùèùåíà lock-îì. Ýòîò lock ìîæíî
ïîëó÷èòü ôóíêöèåé GetProgramDir() áåç àðãóìåíòîâ. Âûïîëíÿòü UnLock()
íà í¸ì ÍÅËÜÇß!
Ñóùåñòâóåò åù¸ îäèí ñïîñîá äîñòóïà ê ýòîé äèðåêòîðèè - óêàçàíèå
«PROGDIR:» â ïóòè ê íåé.
43) Ëèíêè
Ëèíêè ïðåäñòàâëÿþò ñîáîé ñðåäñòâî ñîçäàíèÿ íåñêîëüêèõ îáúåêòîâ,
ôèçè÷åñêè ññûëàþùèõñÿ íà îäèí è òîò æå îáúåêò íà äèñêå. Ñóùåñòâóåò äâà
òèïà ëèíêîâ - hard è soft.
Hard-ëèíêè ïðåäñòàâëÿþò ñîáîé íåñêîëüêî çàïèñåé â êàòàëîãå äèñêà,
ôèçè÷åñêè ññûëàþùèõñÿ íà îäèí è òîò æå îáúåêò. Âñå îíè äîëæíû
íàõîäèòüñÿ â ïðåäåëàõ îäíîãî äèñêà. Ýòè çàïèñè ðàâíîöåííû, è îáúåêò
ñóùåñòâóåò äî òåõ ïîð, ïîêà ñóùåñòâóåò õîòÿ áû îäíà çàïèñü î í¸ì.
Soft-ëèíêè ïðåäñòàâëÿþò ñîáîé ïóòü, ôàêòè÷åñêè â âèäå òåêñòîâîé
ñòðîêè. Îíè ìîãóò ññûëàòüñÿ íà ëþáîé îáúåêò, ëþáîãî òèïà, íà ëþáîì
äèñêå. Íàëè÷èå îáúåêòà íå ïðîâåðÿåòñÿ.
Äëÿ ñîçäàíèÿ ëèíêà èñïîëüçóåòñÿ ôóíêöèÿ MakeLink(), êîòîðîé
ïåðåäà¸òñÿ èìÿ ëèíêà (D1), îáúåêò, íà êîòîðûé ñîçäà¸òñÿ ëèíê (D2) è
òèï ëèíêà (D3) - íóëü äëÿ hard-ëèíêîâ, íå íóëü äëÿ soft-ëèíêîâ.
 ñëó÷àå ñîçäàíèÿ soft-ëèíêà âòîðûì àðãóìåíòîì ïåðåäà¸òñÿ
òåêñòîâàÿ ñòðîêà, â ñëó÷àå æå hard-ëèíêà ýòî äîëæåí áûòü lock íà
îáúåêò.
Íåñìîòðÿ íà òî, ÷òî ôèçè÷åñêè soft-ëèíê ñîäåðæèò ïóòü, ïðè
äîñòóïå ê íåìó (Open() èëè Lock()), ðàçóìååòñÿ, ìû ïîëó÷àåì òîò
îáúåêò, íà êîòîðûé îí ññûëàåòñÿ. ×òîáû ñ÷èòàòü ññûëêó, ïðèìåíÿåòñÿ
ReadLink() - îïèñàííûé â dos.doc.
44) Ðàáîòà ñ äèðåêòîðèÿìè
Ïðîãðàììû òèïà Directory Opus äîëæíû èìåòü ñðåäñòâî ñ÷èòûâàíèÿ
ðàçëè÷íûõ ïàðàìåòðîâ ôàéëîâ è äèðåêòîðèé - êîììåíòàðèåâ, äàò ñîçäàíèÿ,
èì¸í, ðàçìåðîâ...
Äëÿ ñ÷èòûâàíèÿ èíôîðìàöèè îá îäèíî÷íîì îáúåêòå èñïîëüçóåòñÿ
ôóíêöèÿ Examine(), êîòîðîé ïåðåäà¸òñÿ lock íà îáúåêò (D1) è óêàçàòåëü
íà ñòðóêòóðó FileInfoBlock (D2), êîòîðóþ çàïîëíèò ýòà ôóíêöèÿ.
Ïîõîæàÿ ôóíêöèÿ ExamineFH() îòëè÷àåòñÿ òåì, ÷òî âìåñòî lock ïîëó÷àåò â
êà÷åñòâå ïåðâîãî àðãóìåíòà filehandle.
Ñòðóêòóðà FileInfoBlock <dos/dos.#?> îáÿçàòåëüíî äîëæíà
èìåòü àäðåñ, êðàòíûé ÷åòûð¸ì (â SAS/Ñ ýòî äåëàåòñÿ êëþ÷îì __aligned
ïåðåä îïèñàíèåì ñòðóêòóðû, íà àññåìáëåðå ïåðåä ñòðóêòóðîé íóæíî
íàïèñàòü cnop 0,4). Íàçíà÷åíèå å¸ ïîëåé òàêîâî:
fib_DiskKey - äëÿ OFS/FFS - íîìåð áëîêà íà äèñêå,
áîëüøèíñòâîì îñòàëüíûõ FS íå èñïîëüçóåòñÿ
fib_DirEntryType - òèï îáúåêòà <dos/dosextens.#?>:
ST_ROOT - êîðíåâàÿ äèðåêòîðèÿ
ST_USERDIR - îáû÷íàÿ äèðåêòîðèÿ
ST_SOFTLINK - soft-link
ST_LINKDIR - hard-link íà äèðåêòîðèþ
ST_FILE - ôàéë
ST_LINKFILE - hard-link íà ôàéë
ST_PIPEFILE - «pipe:»
 îáùåì ñëó÷àå, ïîëîæèòåëüíîå çíà÷åíèå
îçíà÷àåò äèðåêòîðèþ, à îòðèöàòåëüíîå - ôàéë.
fib_FileName - èìÿ (íå óêàçàòåëü, à 108 áàéò èìåíè)
fib_Protection - ôëàãè HSPARWED
fib_EntryType - íåäîêóìåíòèðîâàíî, íå âçäóìàéòå èñïîëüçîâàòü
fib_Size - äëèíà ôàéëà
fib_NumBlocks - ñêîëüêî áëîêîâ äèñêà çàíèìàåò îáúåêò, â ò.÷.
äèðåêòîðèÿ. Èñïîëüçîâàòü íå ðåêîìåíäóåòñÿ
fib_Date - ñòðóêòóðà DateStamp - äàòà/âðåìÿ ïîñëåäíåé
ìîäèôèêàöèè îáúåêòà
fib_Comment - êîììåíòàðèé (íå óêàçàòåëü, à 79 áàéò)
fib_OwnerUID - èñïîëüçóþòñÿ òîëüêî äëÿ multiuser,
fib_OwnerGID íà îáû÷íûõ ôàéëîâûõ ñèñòåìàõ íåäåéñòâèòåëüíû
Äëÿ òîãî, ÷òîáû ïîëó÷èòü èíôîðìàöèþ îáî âñåé äèðåêòîðèè, äåëàåòñÿ
ñëåäóþùåå: ñíà÷àëà âûïîëíÿåòñÿ Examine(), âîçâðàùàþùàÿ èíôîðìàöèþ îá
ýòîé äèðåêòîðèè, à ïîòîì ïîñëåäîâàòåëüíî âûïîëíÿåòñÿ ôóíêöèÿ ExNext()
ñ òåìè æå àðãóìåíòàìè, êàæäûé âûçîâ êîòîðîé âîçâðàòèò ñâåäåíèÿ îá
î÷åðåäíîì îáúåêòå äèðåêòîðèè. Î÷åâèäíî, ÷òî FileInfoBlock â òå÷åíèå
âñåãî ïðîöåññà äîëæåí áûòü îäíèì è òåì æå.
ExNext() ñëåäóåò âûïîëíÿòü äî òåõ ïîð, ïîêà îí íå âåðí¸ò FALSE.
Ïîñëå ýòîãî íóæíî óáåäèòüñÿ, ÷òî êîä îøèáêè (IoErr()) ñîîòâåòñòâóåò
ERROR_NO_MORE_ENTRIES - â ïðîòèâíîì ñëó÷àå ýòî äåéñòâèòåëüíî îøèáêà
îáðàùåíèÿ ê äèñêó.
Ñóùåñòâóåò åù¸ îäèí ñïîñîá ñ÷èòûâàíèÿ äèðåêòîðèè - öåëèêîì. Äëÿ
ýòîãî ñóùåñòâóþò ôóíêöèè ExAll() è ExAllEnd(). Èíòåðåñóþùèåñÿ ìîãóò
îçíàêîìèòüñÿ ñ íèìè â dos.doc.
Ôóíêöèÿ CreateDir() ïîçâîëÿåò ñîçäàòü íîâóþ äèðåêòîðèþ. Åé
ïåðåäà¸òñÿ èìÿ äèðåêòîðèè (D1). Ðåçóëüòàò - exclusive lock íà íå¸ èëè
íóëü â ñëó÷àå îøèáêè.
ParentDir() ïîçâîëÿåò íàéòè ðîäèòåëüñêóþ äèðåêòîðèþ ïî lock-ó íà
ëþáîé îáúåêò â íåé (D1). Ïîõîæàÿ ôóíêöèÿ ParentOfFH() äåëàåò òî æå
ñàìîå ïî filehandle.
45) Øàáëîíû
Øàáëîíû (îíè æå «ìàñêè» è «ðåãóëÿðíûå âûðàæåíèÿ») - ìåõàíèçì äëÿ
èäåíòèôèêàöèè ñòðîê, óäîâëåòâîðÿþùèõ îïðåäåë¸ííûì ïðàâèëàì. Ïîäðîáíî
îïèñàíû â êíèãå Ä.Ìèõàéëîâà. Øàáëîíû ìîæíî èñïîëüçîâàòü íå òîëüêî äëÿ
èì¸í ôàéëîâ, íî è âîîáùå äëÿ ïðîèçâîëüíûõ öåëåé.
Ôóíêöèÿ ParsePattern() ïåðåâîäèò øàáëîí âî âíóòðåííèé ôîðìàò, â
êîòîðîì îí èñïîëüçóåòñÿ äëÿ èäåíòèôèêàöèè ñòðîêè. Øàáëîí âî âíóòðåííåì
ôîðìàòå ìîæåò çàíèìàòü áîëåå ÷åì â äâà ðàçà áîëüøå, ÷åì èñõîäíàÿ
ñòðîêà. Àðãóìåíòû ôóíêöèè - èñõîäíàÿ ñòðîêà (D1), áóôåð äëÿ øàáëîíà
(D2) è åãî ðàçìåð (D3).
Ðåçóëüòàò ôóíêöèè: íóëü - ñòðîêà íå ÿâëÿåòñÿ øàáëîíîì,
1 - ñòðîêà îáðàáîòàíà óñïåøíî,
-1 - ïåðåïîëíåíèå áóôåðà èëè äðóãàÿ îøèáêà.
Ðåçóëüòàò ðàáîòû ParsePattern() èñïîëüçóåòñÿ â MatchPattern().
Àðãóìåíòû - øàáëîí âî âíóòðåííåì ôîðìàòå (D1) è ïðîâåðÿåìàÿ ñòðîêà
(D2). Ôóíêöèÿ ÿâëÿåòñÿ ðåêóðñèâíîé è âåñüìà òðåáîâàòåëüíà ê ñòåêó!
Îïèñàííûå ôóíêöèè - case-sensitive (òî åñòü çàãëàâíûå è ñòðî÷íûå
áóêâû äëÿ íèõ ðàçëè÷íû). Åñëè òðåáóåòñÿ, ÷òîáû çàãëàâíûå è ñòðî÷íûå
íå ðàçëè÷àëèñü, íóæíî èñïîëüçîâàòü äðóãóþ ïàðó: MatchPatternNoCase()
è ParsePatternNoCase()
Ñóùåñòâóåò ìåõàíèçì ðàáîòû ñ îáúåêòàìè äèðåêòîðèè ïî øàáëîíàì.
Äëÿ ýòîãî ñóùåñòâóþò ôóíêöèè MatchFirst(), MatchNext() è MatchEnd().
Áîëåå ïîäðîáíî - ÷èòàéòå dos.doc.
46) Íîòèôèêàöèÿ
Íîòèôèêàöèÿ ïðåäñòàâëÿåò ñîáîé ìåõàíèçì èíôîðìèðîâàíèÿ Âàøåé
çàäà÷è îá èçìåíåíèÿõ, ïðîèçîøåäøèõ ñ ôàéëîâîé ñèñòåìîé. Îáû÷íî îíà
èñïîëüçóåòñÿ â ïðîãðàììàõ òèïà Directory Opus.
Íå âñå òèïû ôàéëîâûõ ñèñòåì ïîääåðæèâàþò ýòó âîçìîæíîñòü -
íàïðèìåð, äëÿ ñåòåé îíà ìîæåò áûòü íåðåàëèçóåìà. Ïðîãðàììà íå äîëæíà
òðåáîâàòü íàëè÷èÿ íîòèôèêàöèè, è äîëæíà óìåòü îáõîäèòüñÿ áåç íå¸.
StartNotify() ïîëó÷àåò àðãóìåíòîì óêàçàòåëü (D1) íà ñòðóêòóðó
NotifyRequest. Ñòðóêòóðà çàïîëíÿåòñÿ äî âûçîâà ôóíêöèè, è äîëæíà áûòü
íåèçìåííîé äî âûïîëíåíèÿ EndNotify(). nr_Name <dos/notify.#?>
óêàçûâàåò íà ñòðîêó - èìÿ îáúåêòà, çà êîòîðûì ìû ñîáèðàåìñÿ ñëåäèòü.
Äëÿ ôàéëà îòñëåæèâàåòñÿ ôàêò åãî çàêðûòèÿ.  ñëó÷àå èçìåíåíèÿ ìîãóò
áûòü äâà âàðèàíòà ðåàêöèè - ïîñûëêà ñîîáùåíèÿ ëèáî ïîñûëêà ñèãíàëà.
Âàðèàíò ðåàêöèè çàâèñèò îò ñîäåðæàíèÿ ïîëÿ nr_Flags (NRF_SEND_MESSAGE
èëè NRF_SEND_SIGNAL). Â çàâèñèìîñòè îò âàðèàíòà íóæíî çàïîëíèòü ïîëÿ
nr_Msg èëè nr_Signal.
EndNotify() ñ òåì æå àðãóìåíòîì çàâåðøàåò íîòèôèêàöèþ. Åãî ìîæíî
âûçûâàòü äàæå â ñëó÷àå, åñëè StartNotify() âåðíóë îøèáêó.  ñëó÷àå
NRF_SEND_MESSAGE ôóíêöèÿ î÷èùàåò ïîðò îò âñåõ íàêîïèâøèõñÿ ñîîáùåíèé.
47) Îïåðàöèè ñ ôàéëîâûìè ñèñòåìàìè â öåëîì
Äëÿ óñòðîéñòâ, ïðåäñòàâëÿþùèõ ñîáîé ôàéëîâûå ñèñòåìû, DOS
ïðåäîñòàâëÿåò íàáîð «ãëîáàëüíûõ» îïåðàöèé. Êàê óæå óïîìèíàëîñü,
ôóíêöèÿ IsFileSystem() ïîçâîëÿåò îïðåäåëèòü òèï óñòðîéñòâà.
Info() ïî lock-ó íà ëþáîé îáúåêò íà äèñêå (D1) çàïîëíÿåò
ñòðóêòóðó InfoData (D2) èíôîðìàöèåé î äèñêå. Ýòà ñòðóêòóðà
<dos/dos.#?> äîëæíà èìåòü àäðåñ, êðàòíûé ÷åòûð¸ì, è ñîäåðæèò
ñëåäóþùèå ïîëÿ:
id_NumSoftErrors - êîëè÷åñòâî îøèáîê â ôàéëîâîé ñèñòåìå
id_UnitNumber - íîìåð óñòðîéñòâà
id_DiskState - ñîñòîÿíèå äèñêà, ïðèíèìàåò ñëåäóþùèå çíà÷åíèÿ:
ID_WRITE_PROTECTED - çàùèòà îò çàïèñè
ID_VALIDATING - èä¸ò âàëèäàöèÿ (OFS/FFS)
ID_VALIDATED - âñ¸ ok
id_NumBlocks - îáú¸ì äèñêà â áëîêàõ
id_NumBlocksUsed - ñêîëüêî áëîêîâ çàíÿòî
id_BytesPerBlock - ðàçìåð áëîêà
id_DiskType - òèï ôàéëîâîé ñèñòåìû:
ID_NO_DISK_PRESENT - äèñê íå âñòàâëåí
ID_UNREADABLE_DISK - äèñê íå ÷èòàåòñÿ
ID_DOS_DISK - OFS
ID_FFS_DISK - FFS
ID_INTER_DOS_DISK - OFS intl
ID_INTER_FFS_DISK - FFS intl
ID_FASTDIR_DOS_DISK - OFS DC
ID_FASTDIR_FFS_DISK - FFS DC
ID_NOT_REALLY_DOS - NDOS
ID_KICKSTART_DISK - A1000 ROM
ID_MSDOS_DISK - MS-DOS
Âîçìîæíû è äðóãèå çíà÷åíèÿ, íàïðèìåð â ñëó÷àå
AFS, PFS, SFS, Macintosh HFS...
Inhibit() - «âûêëþ÷åíèå» ôàéëîâîé ñèñòåìû. Èñïîëüçóåòñÿ äëÿ
òîãî, ÷òîáû ïîëó÷èòü äîñòóï ê äèñêó íàïðÿìóþ áåç ðèñêà êîíôëèêòîâ ñ
ôàéëîâîé ñèñòåìîé. Ýòó âîçìîæíîñòü, íàïðèìåð, èñïîëüçóþò DMS è
DiskSalv. Àðãóìåíòû - èìÿ óñòðîéñòâà (D1) è ôëàã TRUE/FALSE (D2).
TRUE «âûêëþ÷àåò» ôàéëîâóþ ñèñòåìó, FALSE «âêëþ÷àåò» å¸ îáðàòíî.
Format() - èíèöèàëèçàöèÿ ôàéëîâîé ñòðóêòóðû, èìåííî ýòà ôóíêöèÿ
âûïîëíÿåòñÿ äëÿ QuickFormat. Àðãóìåíòû - ôèçè÷åñêîå èìÿ óñòðîéñòâà
(D1 - íàïðèìåð, «DF0:»), èìÿ äèñêà ÁÅÇ ÄÂÎÅÒÎ×Èß (D2 - íàïðèìåð,
«System»), è òèï ôàéëîâîé ñèñòåìû, åñëè îíà ïîääåðæèâàåò íåñêîëüêî
òèïîâ. Ïåðåä âûïîëíåíèåì Format() ñëåäóåò âûïîëíèòü Inhibit(), èíà÷å
áóäåò îøèáêà.
Relabel() ïîçâîëÿåò ñìåíèòü ëîãè÷åñêîå èìÿ äèñêà, ïîëó÷àÿ èìÿ
óñòðîéñòâà (D1) è íîâîå èìÿ äèñêà ÁÅÇ ÄÂÎÅÒÎ×Èß (D2).
AddBuffers() ïîçâîëÿåò óïðàâëÿòü ðàçìåðîì êýøà ôàéëîâîé ñèñòåìû.
Àðãóìåíòû - èìÿ óñòðîéñòâà (D1) è çíà÷åíèå, íà êîòîðîå óâåëè÷èâàåòñÿ
ðàçìåð êýøà â áëîêàõ (D2). Äëÿ óìåíüøåíèÿ óêàçûâàåòñÿ îòðèöàòåëüíûì.
Ðàçìåð áëîêà çàâèñèò îò ôàéëîâîé ñèñòåìû.
48) DOS-Packets
DOS-Packets - ìåõàíèçì íèçêîóðîâíåâîé ðàáîòû ñ DOS. Áîëüøèíñòâî
ïåðå÷èñëåííûõ ðàíåå ôóíêöèé DOS ðåàëüíî ïðåäñòàâëÿåò ñîáîé
âûñîêîóðîâíåâóþ îáîëî÷êó ê DOS-ïàêåòàì, ðåàëèçóþùóþ, íàïðèìåð,
ðåêâåñòîðû ïðè îøèáêàõ (Retry/Cancel) è áóôåðèçàöèþ. Ôàêòè÷åñêè
DOS-ïàêåòû ïðåäñòàâëÿþò ñîáîé ñîîáùåíèÿ Exec.
Èñïîëüçîâàíèå DOS-ïàêåòîâ èìååò ñìûñë äëÿ ñëåäóþùèõ çàäà÷:
- àñèíõðîííûé ââîä-âûâîä
- îòêëþ÷åíèå ðåêâåñòîðîâ ïðè îøèáêå
- îïåðàöèè ñ ôàéëîâûìè ñèñòåìàìè, íå îãðàíè÷åííûå âîçìîæíîñòÿìè DOS
DOS-ïàêåò ïðåäñòàâëåí ñòðóêòóðîé StandardPacket, ñîäåðæàùåé
ñòðóêòóðû Message (ïîëå sp_Msg) è DosPacket (sp_Pkt). Ñòðóêòóðà
DosPacket ñîäåðæèò ñëåäóþùèå ïîëÿ:
dp_Link - óêàçàòåëü íà sp_Msg <dos/dosextens.#?>
dp_Port - ReplyPort äëÿ ïàêåòà. Äëÿ âûïîëíåíèÿ âûñîêîóðîâíåâûõ
ôóíêöèé DOS èñïîëüçóåò pr_MsgPort ïðîöåññà. Ïðè
àñèíõðîííîé ðàáîòå ñ DOS ïîðò íóæíî ñîçäàòü ñàìîìó.
dp_Type - êîä îïåðàöèè
Êîäû îïåðàöèé ïåðå÷èñëåíû â <dos/dosextens.#?>
dp_Res1 - ðåçóëüòàò (òî, ÷òî âîçâðàùàþò ôóíêöèè DOS)
dp_Res2 - âòîðè÷íûé êîä îøèáêè (IoErr())
dp_Arg1
dp_Arg2
dp_Arg3
dp_Arg4
dp_Arg5
dp_Arg6
dp_Arg7 - àðãóìåíòû. Ñïåöèôè÷íû äëÿ âûïîëíÿåìîé îïåðàöèè.
Èñïîëüçîâàíèå DOS-ïàêåòîâ ïî ñóòè ïîõîæå íà ðàáîòó ñ äåâàéñàìè.
DOS ïðåäîñòàâëÿåò àíàëîãè÷íûé ðàáîòå ñ äåâàéñàìè íàáîð ôóíêöèé:
DoPkt()
SendPkt()
WaitPkt()
ReplyPkt()
AbortPkt()
Ôóíêöèè îïèñàíû â dos.doc. Ïîðò, â êîòîðûé îòïðàâëÿåòñÿ
ñîîáùåíèå, áåð¸òñÿ èç filehandle (ïîëå fh_Arg1) - íå çàáóäüòå, ÷òî
filehandle ïðåäñòàâëÿåò ñîáîé BCPL-óêàçàòåëü! Ýòî ïîðò õýíäëåðà
(èëè ôàéëîâîé ñèñòåìû), êîòîðàÿ îáñëóæèâàåò íóæíîå íàì óñòðîéñòâî.
Ïåðåä âûïîëíåíèåì îïåðàöèè ñòðóêòóðà çàïîëíÿåòñÿ àðãóìåíòàìè è
êîäîì îïåðàöèè, çàòåì ñ ïîìîùüþ ïåðå÷èñëåííûõ ôóíêöèé ëèáî PutMsg()
ïîñûëàåòñÿ ñîîáùåíèå. Ïî çàâåðøåíèè îïåðàöèè íà ñîîáùåíèå ïðèõîäèò
îòâåò, êîòîðûé ìîæíî îæèäàòü êàê ñ ïîìîùüþ WaitPkt(), òàê è ñ ïîìîùüþ
ñðåäñòâ Exec.
Î÷åíü ïîäðîáíîå îïèñàíèå ðàáîòû ñ DOS Packets, à òàêæå ðÿä
ïðèìåðîâ ïðèâåäåíû â Guru Book.
[to be continued]